微服务中提倡的无状态服务,具体可行吗?

2020-11-05 11:50:41 +08:00
 James369
在微服务和 REST 中,建议服务无状态化(服务器不保存状态,由客户端请求的时候自己带上来,达到请求的幂等性),这样有利于集群多机扩展。
这个想想感觉不可思议,server 不是都有 session 会话吗,难道 session 都不要了?
再比如电商应用的购物车,肯定得存在服务器中吧,具体是如何实施的
1750 次点击
所在节点    程序员
6 条回复
miser
2020-11-05 12:01:39 +08:00
该存 DB 存 DB,该缓存的缓存,该 redis 的 redis,session 本身就是一种内存数据,只是把这个数据从单独服务器一道了一个大的集群而已
lrvinye
2020-11-05 15:36:02 +08:00
token,关键词 JWT,不过有时效性
opengps
2020-11-05 16:20:25 +08:00
session 要集中共享到第三方,尽量避免每台机器存自己的用户会话状态,不然同一用户产生的连接过来之后,不一定实际是哪台后端机器承载,会出现丢失会话的问题

集群设计的系统,一般都会有类似的要求。单独搞一个“会话状态服务”,比如存到 redis,存到数据库等等
如果实在是没设计成无状态,那就只能靠负载均衡的“改写 cookie”这种方案来实现多台机器组成集群了
acmore
2020-11-05 17:04:19 +08:00
无状态不是服务器真的不保存状态,而是客户端可以通过凭证在无感知的情况下从任何一台机器请求都能得到一样的结果。Session 不大的话每次直接带在 Request Body 中也未尝不可,我就见过很多服务把一堆状态数据塞在 Jwt 的 Claims 中来回倒腾的。Session 大的话就放在 Redis 集群,随用随拿。
xuanbg
2020-11-05 17:31:13 +08:00
对的,不要了。请求头带一个 token 就完了。

不过,这个和 session 并没有什么本质区别。只不过分布式系统都交给一个统一的验证服务去做用户身份和权限的验证罢了。
xuanbg
2020-11-05 17:34:17 +08:00
@acmore 把一堆状态数据塞在 Jwt 的 Claims 中来回倒腾的,说明 jwt 实际上已经不适合这种场景了。jwt 的应用场景其实并不大,而且只适合比较小型的系统。一个大型的系统,用户能有上千个权限,这些权限数据直接发放给客户端简直就是灾难。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/721985

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX