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

25 天前
 fingerxie

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

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

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

1845 次点击
所在节点    程序员
23 条回复
xuanbg
25 天前
轮询啊,http 哪怕是长链接(事实上默认都是长链接)你也是无法反向推送消息的。
EscYezi
25 天前
前端轮询是最简单的,后端任意节点状态更新到 redis ,接口直接查询 redis 数据返回,最多加个 db 查询兜底。
如果一定要长连接,也有简化方案,前端到接口用 websocket/sse ,接口实际还是轮询 redis 并返回,这样即使重新连接到不同节点也无所谓,一定程度算是无状态的。
更加麻烦的方案:
- 多个 websocket 节点,mq 广播结果(引入额外依赖和故障点 mq)
- 中心化维护用户与节点的连接信息,这样可以直接通知到对应节点(引入中心化信息更新问题)
- websocket 节点直接互相连接,对于不是自己的消息用 rpc 或者 websocket 或者 http 转发到其他节点(复杂度最高)
这 5 个方案前 4 个都有用过,最后发现 1 方案反而是最好的,实现简单,无状态易扩展,故障点少。2 3 也比较可靠,增加些复杂度。4 踩过坑之后不准备用了。
jin001
21 天前
别搞复杂

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

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

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

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

© 2021 V2EX