我正在使用SignalR和Redis作为服务器上的消息总线,该服务器位于Nginx代理后面以实现负载平衡。我使用SignalR的PersistentConnection类编写了一个简单的聊天程序,该程序向属于同一特定组的用户广播消息。用户将添加到OnConnectedAsync中的组中,在OnDisconnectAsync中删除,并且用户到组映射是确定性的。
目前,客户端由于某种原因(我不完全确定原因)回退到长轮询,并且每当客户端在等待和接收响应之后建立新连接时,看似随机,服务器将尽管只有一个POST,但有时会立即响应前一个响应的新连接。
消息ID往往只相差一个(较小的ID首先出现),其余的响应保持不变。我记录了一些调试信息,我非常肯定我的OnReceivedAsync覆盖每个请求发送一个响应。我尝试了没有Redis消息总线的相同实现,并遇到了同样的问题。然而,本地运行(使用长轮询)产生了良好的结果,因此我怀疑问题可能在于消息总线可能正在缓冲消息以刷新可能未被捕获的客户端的方式,以及切换/设置的一些奇怪的时间与Nginx负载均衡器的连接,但除此之外,我非常茫然。
任何帮助都将不胜感激。
编辑:进一步调查显示,重复发生的时间间隔约为20-30秒。我被引导相信消息总线中的消息过期可能与错误有关。编辑:可以在此处看到错误:http://tinyurl.com/9q5t3va
服务器只是广播客户端发送的计数器。您会注意到每20个左右会有一些回复。
答案 0 :(得分:1)
将IIS(6.0)服务器管理器中的工作进程数从2减少到1解决了这个问题。