V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fingerxie
V2EX  ›  程序员

服务端如何实时同步状态变化?

  •  
  •   fingerxie · 3 天前 · 1572 次点击

    最近在做扫码登录,这个功能在展示二维码以后,会与其中一个认证服务的实例建立长连接,实时反馈二维码状态变更。

    在单实例情况下,这很好实现,但是多实例的话,状态变化时,就需要通知到对应实例。但是如何通知是一个问题。

    V 友们,各位大佬们,有什么好的方案去解决这个问题吗?

    22 条回复    2024-11-02 02:43:43 +08:00
    opengps
        1
    opengps  
       3 天前
    不需要解决,本身就是得支持多个长连接
    esee
        2
    esee  
       3 天前   ❤️ 1
    非得长连接?轮询不行么?
    spritecn
        3
    spritecn  
       3 天前
    这个网关的会话保持就解决了吧
    fcten
        4
    fcten  
       3 天前
    长连接接入需要一个 session 服务维护每个会话对应的连接
    扫码登录轮询就行了
    fingerxie
        5
    fingerxie  
    OP
       3 天前
    @spritecn 不行吧,因为扫码的是手机端,并不能保证请求同一个服务吧?
    spritecn
        6
    spritecn  
       3 天前
    @fingerxie 网关的会话保持一般无非就是 iphash 或是插 session 的思路,有啥不行
    vZexc0m
        7
    vZexc0m  
       3 天前
    轮询不会比长连接消耗大
    jingrui
        8
    jingrui  
       3 天前
    前端轮训,简单高效,登录并发也不会太高
    cat
        9
    cat  
       3 天前
    连微信官网的扫码登录都是轮询…… https://mp.weixin.qq.com/ 折腾长连接干啥呀
    cccssss
        10
    cccssss  
       3 天前
    redis publish ?消息队列广播?
    onceMore
        11
    onceMore  
       3 天前 via Android
    直接轮询,方案越简单,可靠性越高
    ZeekChatCom
        12
    ZeekChatCom  
       3 天前
    生成个 id 啊
    shadowyue
        13
    shadowyue  
       3 天前
    轮询还是长链接要看你业务的契合度。
    至少前几年,我专门研究了下,淘宝的扫码登录就是轮询,微信的就是长链接。
    非常契合这两家的业务基础。淘宝就是查询多,微信作为聊天软件就是擅长维持长链接。
    hellomsg
        14
    hellomsg  
       3 天前
    一两秒一个轮询对用户来说也不是不可以,用户体验没差别
    allecnm
        15
    allecnm  
       3 天前
    微信支付宝都是轮询
    sujin190
        16
    sujin190  
       3 天前
    其实这种还是使用 long polling 轮询实现更简单快捷,搞个异步 IO 的框架,挂起实现不要太简单
    hellomsg
        17
    hellomsg  
       3 天前
    不说你业务的实现方式,只说你关心的点,我猜是在分布式环境中,客户端之间如何通信?就是消息路由。要么广播;要么有个中心负责转发给客户端所在的服务器,再下发给客户端。中心可以是消息队列。
    hellomsg
        18
    hellomsg  
       3 天前
    简单轮询的方式,就是查数据库,数据库就是中心,主动去取。
    fingerxie
        19
    fingerxie  
    OP
       3 天前
    @hellomsg 是这样,我也考虑采用消息队列来做。利用广播消息的机制实现。不过我在想有没有什么更好的方案
    spicy777
        20
    spicy777  
       3 天前
    之前做的扫码登录都是用的轮询
    xuanbg
        21
    xuanbg  
       3 天前
    轮询啊,http 哪怕是长链接(事实上默认都是长链接)你也是无法反向推送消息的。
    EscYezi
        22
    EscYezi  
       3 天前 via Android   ❤️ 1
    前端轮询是最简单的,后端任意节点状态更新到 redis ,接口直接查询 redis 数据返回,最多加个 db 查询兜底。
    如果一定要长连接,也有简化方案,前端到接口用 websocket/sse ,接口实际还是轮询 redis 并返回,这样即使重新连接到不同节点也无所谓,一定程度算是无状态的。
    更加麻烦的方案:
    - 多个 websocket 节点,mq 广播结果(引入额外依赖和故障点 mq)
    - 中心化维护用户与节点的连接信息,这样可以直接通知到对应节点(引入中心化信息更新问题)
    - websocket 节点直接互相连接,对于不是自己的消息用 rpc 或者 websocket 或者 http 转发到其他节点(复杂度最高)
    这 5 个方案前 4 个都有用过,最后发现 1 方案反而是最好的,实现简单,无状态易扩展,故障点少。2 3 也比较可靠,增加些复杂度。4 踩过坑之后不准备用了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4625 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 05:36 · PVG 13:36 · LAX 21:36 · JFK 00:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.