【发布时间】:2012-08-06 08:14:05
【问题描述】:
我将 SignalR 与 Redis 一起用作服务器上的消息总线,该服务器位于 Nginx 代理后面以实现负载平衡。我使用 SignalR 的 PersistentConnection 类编写了一个简单的聊天程序,该程序将消息广播给属于同一特定组的用户。用户在 OnConnectedAsync 中添加到组,在 OnDisconnectAsync 中删除,用户到组的映射是确定性的。
目前,无论出于何种原因,客户端都会退回到长轮询(我不完全确定为什么),并且每当客户端在等待并接收到响应后建立新连接时,似乎是随机的,服务器将尽管只有一个 POST,但有时会立即使用先前的响应来响应新连接。
消息 ID 往往相差一个(较小的 ID 首先出现),其余的响应保持不变。我记录了一些调试信息,并且非常肯定我对 OnReceivedAsync 的覆盖正在为每个请求发送一个响应。我在没有 Redis 消息总线的情况下尝试了相同的实现,但遇到了同样的问题。然而,在本地运行(使用长轮询)产生了很好的结果,所以我怀疑问题可能出在消息总线可能缓冲消息以刷新可能没有被赶上的客户端的方式上,以及切割/设置的一些奇怪的时间与 Nginx 负载均衡器的连接,但除此之外,我非常茫然。
任何帮助将不胜感激。
编辑:进一步调查显示,重复发生的时间间隔大约为 20-30 秒。我被引导相信消息总线中的消息过期可能与该错误有关。
编辑:可以在这里看到错误:http://tinyurl.com/9q5t3va
服务器只是广播客户端发送的计数器。您会注意到有些响应每 20 次左右就会重复一次。
【问题讨论】:
-
在 github 上提交问题,并提供重现和重现步骤。
-
无法在本地重现错误。当(如果)我能够做到这一点时,将提交报告。
标签: nginx load duplicates signalr