负载均衡器后端部署SignalR是否可以不使用背板?
问题解答
多实例无背板的运行状态
- 严格来说无法稳定正常运行,单靠实例本地内存维护的状态会出现大范围上下文不一致问题,远不止丢失重连阶段消息这么简单。
重连到新实例的具体问题
除了你可接受的重连过程中产生的消息丢失外,还会出现以下核心问题:
- 新实例(pod B)完全没有你之前连接的状态数据:SignalR原生的群组关系、你自己在业务层维护的用户与连接映射、订阅标记等存在pod A内存中的数据,在pod B中不存在。重连后仅会生成全新的ConnectionId,不会自动还原任何之前的业务状态。
- 跨实例消息完全丢失:没有背板做跨实例消息分发的情况下,每个实例只能给自己当前持有的连接推消息。如果RabbitMQ的消息被pod A消费,而你此时连接的是pod B,这条消息会直接丢失,并非只有重连窗口期的消息会丢。
- RabbitMQ消费逻辑可能出现资源浪费:如果每个实例独立消费RabbitMQ队列,同一条消息会被所有实例重复消费,大部分没有对应目标连接的消息会被直接丢弃,白白占用队列消费带宽和服务端算力。
重连后的订阅逻辑说明
- 重连到pod B的连接会被SignalR识别为全新的常规连接,只会触发标准的
OnConnectedAsync生命周期事件,不会自动携带首次连接时的自定义订阅参数,也不会默认执行你首次连接时写的订阅相关代码。 - 如果你没有在客户端的
onreconnected回调中手动上传订阅所需参数、重新调用Hub的订阅方法,服务端不会主动完成订阅,你会完全收不到重连后的所有消息,而非仅丢失重连阶段的内容。 - 如果你已经在客户端实现了重连后主动触发重订阅的逻辑,且可以接受跨实例消息丢失、RabbitMQ重复消费的问题,可临时跑通流程,但仍然属于非稳定的生产方案。
内容的提问来源于stack exchange,提问作者Serg046
相关产品推荐
相关产品推荐

