多ASP.NET Core App Service实例下Azure SignalR连接事件及生命周期问题
Azure SignalR 多实例部署常见问题解答
1. 对接多个应用实例时,Azure SignalR Service的连接生命周期是怎样的?
- 客户端优先与Azure SignalR服务端建立长连接,不会直接连接到你的App Service实例
- 连接建立成功后,Azure SignalR会从所有健康的上游App Service实例中选择一个,将该连接的上下文路由到这个实例,触发
OnConnectedAsync自定义逻辑 - 连接存续期间,所有客户端发送的消息、连接状态变更事件,默认都会转发到首次绑定的App Service实例处理
- 连接主动断开、或因网络异常超时断开时,会触发对应实例上的
OnDisconnectedAsync逻辑,Azure SignalR会同步清理该连接的所有路由绑定信息
2. Azure会自动为连接绑定特定的App Service节点亲和性吗?Connected和Disconnected事件是否有可能在不同的App Service实例上触发?
- 不存在应用层的节点亲和性强制绑定,但单个正常连接的全生命周期事件默认会路由到同一个上游实例,常规场景下
OnConnectedAsync和OnDisconnectedAsync会在同一个App Service实例上触发 - 唯一的例外是绑定的App Service实例在连接存续期间异常宕机、或主动下线被Azure SignalR判定为不健康:此时Azure SignalR会直接断开对应客户端连接,原实例因为已经不可用,不会收到
OnDisconnectedAsync事件;客户端重连后会被路由到新的健康实例,新实例会触发新连接的OnConnectedAsync逻辑
3. 使用Azure SignalR Service时无需配置粘性会话,这意味着连接不会绑定到特定的应用实例,那这种场景下连接生命周期是可确定的吗?
- 文档中提到的无需配置粘性会话,指的是客户端到Azure SignalR的连接不需要你手动配置与固定App Service节点的绑定,路由逻辑完全由Azure SignalR托管,无需自行维护会话保持规则
- 正常场景下连接生命周期完全可确定:只要绑定的上游App Service实例保持健康运行,单个连接的所有事件、消息都会固定路由到同一个实例处理,你可以依赖这个特性实现用户映射逻辑
- 如果需要规避实例宕机导致的映射数据丢失问题,建议不要将用户关联映射存储在单实例内存中,改用分布式缓存存储即可,无论连接后续被路由到哪个实例都能正常读写数据
内容的提问来源于stack exchange,提问作者Maxim Gershkovich
相关产品推荐
相关产品推荐

