- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在通过不同的负载均衡器(我尝试过弹性负载均衡器和 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/
我是一名优秀的程序员,十分优秀!