负载均衡环境下无Redis及粘性会话的SignalR实现方案咨询
自定义分布式缓存能否作为SignalR背板?
不能直接使用。SignalR的分布式背板需要处理服务器间的消息路由、连接状态同步、广播通知等复杂逻辑,而标准的IDistributedCache接口仅提供键值对存储能力,无法满足SignalR的分布式通信需求。若要基于现有自定义分布式缓存实现SignalR背板,需手动实现IMessageBus和IScaleoutMessageBus接口,这涉及深入理解SignalR的分布式架构,开发与维护成本极高,不推荐作为首选方案。
替代解决方案(无需粘性会话)
改用Blazor WebAssembly模式
将项目从Blazor Server迁移到Blazor WebAssembly,客户端直接与后端API通信,SignalR连接由客户端发起并绑定到单个服务器节点,负载均衡器仅需处理普通HTTP请求转发,避免跨服务器WebSocket连接问题。需评估项目是否依赖服务器端资源访问等不适合WASM的场景。配置负载均衡器的WebSocket专用会话亲和性
部分负载均衡器支持针对WebSocket持久连接的会话路由策略(区别于HTTP粘性会话),可基于源IP或WebSocket连接ID将同一连接始终转发到同一服务器。检查你的负载均衡器是否提供该功能,开启后无需修改应用代码即可解决问题。使用其他官方支持的SignalR背板
除Redis外,官方还支持SQL Server、Azure Service Bus作为SignalR背板:- SQL Server背板:依赖现有SQL Server实例,配置简单
builder.Services.AddSignalR() .AddSqlServer("Your_SQL_Server_Connection_String"); - Azure Service Bus背板:适合云环境部署,需配置Service Bus连接字符串
- SQL Server背板:依赖现有SQL Server实例,配置简单
实现自定义SignalR背板(进阶方案)
若必须基于现有自定义分布式缓存构建,可自行实现SignalR的IMessageBus接口,处理服务器间的消息传递与连接事件同步。此方案仅适合有深度定制需求且具备SignalR分布式架构经验的团队。
内容的提问来源于stack exchange,提问作者Wolfenstyne

