通过负载均衡器的 SignalR
SignalR through Load Balancer
我通过不同的负载均衡器遇到 SignalR 的一个奇怪问题(我已经尝试过弹性负载均衡器和 HAProxy)。
我的设置如下:
C# 客户端 -> HAProxy -->(SignalR 主机 1 或 SignalR 主机 2)
HAProxy 配置为使用 cookie 循环以确保会话粘性
平衡循环
cookie SERVERID insert indirect nocache
当我在代理后面有一个 SignalR 主机时(使用长轮询或服务器发送事件)一切正常。我可以连接、调用方法和处理回调。
一旦我添加了第二个 SignalR 服务器,事情就开始变得很糟糕。我可以很好地连接,并且连接可以正确地进行负载平衡。我可以发送消息,它们会正确地粘在服务器上。问题是回调永远不会通过代理返回给我的客户端。
令人困惑的是,这适用于在负载均衡器上配置的单个主机。
另一个注意事项:我不打算使用背板横向扩展 SignalR。我的信号主机不需要相互了解或关心连接的客户端。在我的架构中,SignalR 是处理通信服务的应用层层的前端。我实际上是在使用 Signlar 来支持来自应用程序的推送通知。
想法?
我想通了...
原来问题是我没有正确处理粘性会话。具体来说,我没有将负载均衡器创建的后端服务器 cookie 与我的集线器连接相关联。结果是保持活动状态来自一台主机,另一台主机从客户端获取所有消息,因此我的客户端有效地静默超时。我启用了 signalr 的所有 System.Diagnostics 来解决这个问题。
我从来没有想过如何处理连接过程中的粘性(可能是创建一个新的持久连接 class 并处理连接消息)。相反,我将其作为使用 REST 调用的登录过程的一部分来完成。我从这些调用中检索 cookie,并将其添加到 hubconnection 的 cookie 容器中,会话正确地保持不变。
更新:
以下是在集线器连接中设置 cookie 的方法
std::unordered_map<utility::string_t, utility::string_t> ConnectionHeaders;
ConnectionHeaders[U("Cookie")] = <INSERT COOKIE>
m_HubConnection->set_headers(ConnectionHeaders);
谢谢
我通过不同的负载均衡器遇到 SignalR 的一个奇怪问题(我已经尝试过弹性负载均衡器和 HAProxy)。
我的设置如下:
C# 客户端 -> HAProxy -->(SignalR 主机 1 或 SignalR 主机 2)
HAProxy 配置为使用 cookie 循环以确保会话粘性
平衡循环
cookie SERVERID insert indirect nocache
当我在代理后面有一个 SignalR 主机时(使用长轮询或服务器发送事件)一切正常。我可以连接、调用方法和处理回调。
一旦我添加了第二个 SignalR 服务器,事情就开始变得很糟糕。我可以很好地连接,并且连接可以正确地进行负载平衡。我可以发送消息,它们会正确地粘在服务器上。问题是回调永远不会通过代理返回给我的客户端。
令人困惑的是,这适用于在负载均衡器上配置的单个主机。
另一个注意事项:我不打算使用背板横向扩展 SignalR。我的信号主机不需要相互了解或关心连接的客户端。在我的架构中,SignalR 是处理通信服务的应用层层的前端。我实际上是在使用 Signlar 来支持来自应用程序的推送通知。
想法?
我想通了...
原来问题是我没有正确处理粘性会话。具体来说,我没有将负载均衡器创建的后端服务器 cookie 与我的集线器连接相关联。结果是保持活动状态来自一台主机,另一台主机从客户端获取所有消息,因此我的客户端有效地静默超时。我启用了 signalr 的所有 System.Diagnostics 来解决这个问题。
我从来没有想过如何处理连接过程中的粘性(可能是创建一个新的持久连接 class 并处理连接消息)。相反,我将其作为使用 REST 调用的登录过程的一部分来完成。我从这些调用中检索 cookie,并将其添加到 hubconnection 的 cookie 容器中,会话正确地保持不变。
更新: 以下是在集线器连接中设置 cookie 的方法
std::unordered_map<utility::string_t, utility::string_t> ConnectionHeaders;
ConnectionHeaders[U("Cookie")] = <INSERT COOKIE>
m_HubConnection->set_headers(ConnectionHeaders);
谢谢