SignalR通过负载均衡器

时间:2015-08-21 22:15:26

标签: signalr

我通过不同的负载平衡器与SignalR有一个奇怪的问题(我尝试过弹性负载平衡器和HAProxy)。

我的设置如下:

C#客户端 - > HAProxy - > (SignalR Host 1或SignalR Host 2)

HAProxy配置为使用cookie进行roundrobin以确保会话粘性

平衡roundrobin
cookie SERVERID insert indirect nocache

当我在代理后面有一个SignalR主机(使用长轮询或服务器发送事件)时,一切正常。我可以连接,调用方法和处理回调。

一旦我添加第二个SignalR服务器,事情开始变得糟糕。我可以正常连接和连接正确负载平衡。我可以发送消息,他们正确地坚持服务器。问题是回调永远不会通过代理回到我的客户端。

令人困惑的是,在负载均衡器上配置的单个主机可以正常工作。

另一个注意事项:我不打算用背板扩展SignalR。我的信号员主人不需要了解彼此或关心相关的客户。在我的架构中,SignalR是处理通信服务范围的应用层层的前端。我基本上使用Signlar来支持来自应用程序的推送通知。

思想?

1 个答案:

答案 0 :(得分:2)

我想出来了......

事实证明问题是我没有正确处理粘性会话。具体来说,我没有将负载均衡器创建的后端服务器cookie与我的集线器连接相关联。结果是keep-alive来自一个主机,其他主机从客户端获取所有消息,因此我的客户端实际上是默默地超时。我从信号器启用了所有System.Diagnostics来解决这个问题。

我从未弄清楚如何在连接过程中处理粘性(可能创建一个新的persistentconnection类并处理连接消息)。相反,我将其作为使用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);

由于