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

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

  •  
  •   fingerxie · 13 天前 · 1727 次点击

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

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

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

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