V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
James369
V2EX  ›  程序员

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

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

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

    不过,这个和 session 并没有什么本质区别。只不过分布式系统都交给一个统一的验证服务去做用户身份和权限的验证罢了。
    xuanbg
        6
    xuanbg  
       2020-11-05 17:34:17 +08:00
    @acmore 把一堆状态数据塞在 Jwt 的 Claims 中来回倒腾的,说明 jwt 实际上已经不适合这种场景了。jwt 的应用场景其实并不大,而且只适合比较小型的系统。一个大型的系统,用户能有上千个权限,这些权限数据直接发放给客户端简直就是灾难。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3155 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 12:54 · PVG 20:54 · LAX 04:54 · JFK 07:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.