最近在做扫码登录,这个功能在展示二维码以后,会与其中一个认证服务的实例建立长连接,实时反馈二维码状态变更。
在单实例情况下,这很好实现,但是多实例的话,状态变化时,就需要通知到对应实例。但是如何通知是一个问题。
V 友们,各位大佬们,有什么好的方案去解决这个问题吗?
![]() | 1 opengps 348 天前 不需要解决,本身就是得支持多个长连接 |
2 esee 348 天前 ![]() 非得长连接?轮询不行么? |
3 spritecn 348 天前 这个网关的会话保持就解决了吧 |
![]() | 4 fcten 348 天前 长连接接入需要一个 session 服务维护每个会话对应的连接 扫码登录轮询就行了 |
![]() | 7 vZexc0m 348 天前 轮询不会比长连接消耗大 |
![]() | 8 jingrui 348 天前 前端轮训,简单高效,登录并发也不会太高 |
![]() | 9 cat 348 天前 连微信官网的扫码登录都是轮询…… https://mp.weixin.qq.com/ 折腾长连接干啥呀 |
10 cccssss 348 天前 redis publish ?消息队列广播? |
11 onceMore 348 天前 via Android 直接轮询,方案越简单,可靠性越高 |
![]() | 12 ZeekChatCom 348 天前 生成个 id 啊 |
![]() | 13 shadowyue 348 天前 轮询还是长链接要看你业务的契合度。 至少前几年,我专门研究了下,淘宝的扫码登录就是轮询,微信的就是长链接。 非常契合这两家的业务基础。淘宝就是查询多,微信作为聊天软件就是擅长维持长链接。 |
14 hellomsg 348 天前 一两秒一个轮询对用户来说也不是不可以,用户体验没差别 |
15 allecnm 348 天前 微信支付宝都是轮询 |
![]() | 16 sujin190 348 天前 其实这种还是使用 long polling 轮询实现更简单快捷,搞个异步 IO 的框架,挂起实现不要太简单 |
17 hellomsg 348 天前 不说你业务的实现方式,只说你关心的点,我猜是在分布式环境中,客户端之间如何通信?就是消息路由。要么广播;要么有个中心负责转发给客户端所在的服务器,再下发给客户端。中心可以是消息队列。 |
18 hellomsg 348 天前 简单轮询的方式,就是查数据库,数据库就是中心,主动去取。 |
![]() | 20 spicy777 348 天前 之前做的扫码登录都是用的轮询 |
![]() | 21 xuanbg 348 天前 轮询啊,http 哪怕是长链接(事实上默认都是长链接)你也是无法反向推送消息的。 |
![]() | 22 EscYezi 348 天前 via Android ![]() 前端轮询是最简单的,后端任意节点状态更新到 redis ,接口直接查询 redis 数据返回,最多加个 db 查询兜底。 如果一定要长连接,也有简化方案,前端到接口用 websocket/sse ,接口实际还是轮询 redis 并返回,这样即使重新连接到不同节点也无所谓,一定程度算是无状态的。 更加麻烦的方案: - 多个 websocket 节点,mq 广播结果(引入额外依赖和故障点 mq) - 中心化维护用户与节点的连接信息,这样可以直接通知到对应节点(引入中心化信息更新问题) - websocket 节点直接互相连接,对于不是自己的消息用 rpc 或者 websocket 或者 http 转发到其他节点(复杂度最高) 这 5 个方案前 4 个都有用过,最后发现 1 方案反而是最好的,实现简单,无状态易扩展,故障点少。2 3 也比较可靠,增加些复杂度。4 踩过坑之后不准备用了。 |
23 jin001 344 天前 via Android 别搞复杂 |