gpt4 book ai didi

通过负载均衡器的 SignalR

转载 作者:行者123 更新时间:2023-12-02 01:34:15 25 4
gpt4 key购买 nike

我在通过不同的负载均衡器(我尝试过弹性负载均衡器和 HAProxy)时遇到一个奇怪的问题。

我的设置如下:

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

HAProxy 配置为与 cookie 循环以确保 session 粘性

平衡轮询
cookie SERVERID insert indirect nocache

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

一旦我添加了第二个 SignalR 服务器,事情就开始变得很糟糕。我可以很好地连接,并且连接可以正确地进行负载平衡。我可以发送消息,它们会正确地粘在服务器上。问题是回调永远不会通过代理返回给我的客户端。

令人困惑的是,这适用于在负载均衡器上配置的单个主机。

另一个注意事项:我不打算使用背板横向扩展 SignalR。我的信号主机不需要相互了解或关心连接的客户端。在我的架构中,SignalR 是处理通信服务的应用层层的前端。我实际上是在使用 Signlar 来支持来自应用程序的推送通知。

想法?

最佳答案

我想通了...

原来问题是我没有正确处理粘性 session 。具体来说,我没有将负载均衡器创建的后端服务器 cookie 与我的集线器连接相关联。结果是保持事件状态来自一台主机,另一台主机从客户端获取所有消息,因此我的客户端有效地静默超时。我启用了 signalr 的所有 System.Diagnostics 来解决这个问题。

我从来没有想过如何处理连接过程中的粘性(可能是创建一个新的持久连接类并处理连接消息)。相反,我将其作为使用 REST 调用的登录过程的一部分来完成。我从这些调用中检索 cookie,并将其添加到 hubconnection 的 cookie 容器中, session 正确地保持不变。

更新:这是在集线器连接中设置 cookie 的方法

std::unordered_map<utility::string_t, utility::string_t> ConnectionHeaders;
ConnectionHeaders[U("Cookie")] = <INSERT COOKIE>
m_HubConnection->set_headers(ConnectionHeaders);

谢谢

关于通过负载均衡器的 SignalR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32150016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com