Signalr 通过负载平衡器发送信号

Signalr 通过负载平衡器发送信号,signalr,Signalr,我在不同的负载平衡器中遇到了一个奇怪的问题(我试过弹性负载平衡器和HAProxy) 我的设置如下: C#客户端->HAProxy-->(信号机主机1或信号机主机2) HAProxy配置为与Cookie循环,以确保会话粘性 平衡循环法 cookie服务器ID插入间接nocache 当我在代理后面有一个信号器主机时(使用长轮询或服务器发送事件),一切正常。我可以连接、调用方法和处理回调 一旦我添加了第二个信号服务器,事情就开始变得糟糕起来。我可以连接良好,连接正确,负载平衡。我可以发送消息,它们会正

我在不同的负载平衡器中遇到了一个奇怪的问题(我试过弹性负载平衡器和HAProxy)

我的设置如下:

C#客户端->HAProxy-->(信号机主机1或信号机主机2)

HAProxy配置为与Cookie循环,以确保会话粘性

平衡循环法
cookie服务器ID插入间接nocache

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

一旦我添加了第二个信号服务器,事情就开始变得糟糕起来。我可以连接良好,连接正确,负载平衡。我可以发送消息,它们会正确地粘贴到服务器上。问题是回调永远不会通过代理返回给我的客户机

令人困惑的是,在负载平衡器上配置一台主机时,这种方法可以很好地工作

另一个注意事项:我不打算用背板扩展信号器。我的信号机主机不需要相互了解,也不需要关心连接的客户端。在我的体系结构中,Signal是处理通信服务范围的应用层的前端。我基本上使用Signlar来支持来自应用程序的推送通知

想法?

我想出来了

原来问题是我没有正确处理粘性会话。具体来说,我没有将负载平衡器创建的后端服务器cookie与我的集线器连接相关联。结果是keep-alive来自一个主机,而另一个主机从客户端获取所有消息,因此我的客户端实际上是在静默中超时的。我启用了所有系统。信号器的诊断来解决这个问题

我从未想过如何在连接过程中处理粘性(可能创建一个新的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);
std::无序映射连接头;
连接头[U(“Cookie”)]=
m_连接->设置_头(连接头);

谢谢

由于客户端可能连接到不同的集线器,因此客户端发送的消息可能无法到达其他连接的客户端,您是否对此感到高兴?是的,就像我说的,signalr是另一个应用层的前端。跨集线器通信是通过另一层完成的。我很好奇控制台中是否有任何错误,如“ERR\u NETWORK\u CHANGED”。我们有一些奇怪的信号和服务器上的负载平衡器。没有。。。我没有看到这样的错误。我启动了日志记录,在服务器上,我注意到一台主机上的“保持活动”消息,而另一台主机正在处理各种其他消息。@bsmatt您可以分享一种更具体的方式,说明如何将cookie添加到cookie容器中吗?谢谢你的回答