服务端如何实时同步状态变化? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
fingerxie
V2EX    程序员

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

  •  
  •   fingerxie 348 天前 2477 次点击
    这是一个创建于 348 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    23 条回复    2024-11-05 17:59:15 +08:00
    opengps
        1
    opengps  
       348 天前
    不需要解决,本身就是得支持多个长连接
    esee
        2
    esee  
       348 天前   1
    非得长连接?轮询不行么?
    spritecn
        3
    spritecn  
       348 天前
    这个网关的会话保持就解决了吧
    fcten
        4
    fcten  
       348 天前
    长连接接入需要一个 session 服务维护每个会话对应的连接
    扫码登录轮询就行了
    fingerxie
        5
    fingerxie  
    OP
       348 天前
    @spritecn 不行吧,因为扫码的是手机端,并不能保证请求同一个服务吧?
    spritecn
        6
    spritecn  
       348 天前
    @fingerxie 网关的会话保持一般无非就是 iphash 或是插 session 的思路,有啥不行
    vZexc0m
        7
    vZexc0m  
       348 天前
    轮询不会比长连接消耗大
    jingrui
        8
    jingrui  
       348 天前
    前端轮训,简单高效,登录并发也不会太高
    cat
        9
    cat  
       348 天前
    连微信官网的扫码登录都是轮询…… https://mp.weixin.qq.com/ 折腾长连接干啥呀
    cccssss
        10
    cccssss  
       348 天前
    redis publish ?消息队列广播?
    onceMore
        11
    onceMore  
       348 天前 via Android
    直接轮询,方案越简单,可靠性越高
    ZeekChatCom
        12
    ZeekChatCom  
       348 天前
    生成个 id 啊
    shadowyue
        13
    shadowyue  
       348 天前
    轮询还是长链接要看你业务的契合度。
    至少前几年,我专门研究了下,淘宝的扫码登录就是轮询,微信的就是长链接。
    非常契合这两家的业务基础。淘宝就是查询多,微信作为聊天软件就是擅长维持长链接。
    hellomsg
        14
    hellomsg  
       348 天前
    一两秒一个轮询对用户来说也不是不可以,用户体验没差别
    allecnm
        15
    allecnm  
       348 天前
    微信支付宝都是轮询
    sujin190
        16
    sujin190  
       348 天前
    其实这种还是使用 long polling 轮询实现更简单快捷,搞个异步 IO 的框架,挂起实现不要太简单
    hellomsg
        17
    hellomsg  
       348 天前
    不说你业务的实现方式,只说你关心的点,我猜是在分布式环境中,客户端之间如何通信?就是消息路由。要么广播;要么有个中心负责转发给客户端所在的服务器,再下发给客户端。中心可以是消息队列。
    hellomsg
        18
    hellomsg  
       348 天前
    简单轮询的方式,就是查数据库,数据库就是中心,主动去取。
    fingerxie
        19
    fingerxie  
    OP
       348 天前
    @hellomsg 是这样,我也考虑采用消息队列来做。利用广播消息的机制实现。不过我在想有没有什么更好的方案
    spicy777
        20
    spicy777  
       348 天前
    之前做的扫码登录都是用的轮询
    xuanbg
        21
    xuanbg  
       348 天前
    轮询啊,http 哪怕是长链接(事实上默认都是长链接)你也是无法反向推送消息的。
    EscYezi
        22
    EscYezi  
       348 天前 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  
       344 天前 via Android
    别搞复杂
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     883 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 21:17 PVG 05:17 LAX 14:17 JFK 17:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86