2012-08-06 46 views
0

我使用SignalR和Redis作为位于Nginx代理之后的服务器上的消息总线进行负载平衡。我使用SignalR的PersistentConnection类来编写一个简单的聊天程序,它将消息广播给属于同一组的用户。用户被添加到OnConnectedAsync中的组中,并在OnDisconnectAsync中被删除,并且用户到组的映射是确定性的。目前,无论出于何种原因(我不完全确定为什么),客户端都会回到长轮询状态,并且每当客户端在等待并接收响应之后建立新连接时(看似随机),服务器有时会对之前的响应立即响应新的连接,尽管只有一个POST。SignalR复制响应

消息ID往往会相差一个(较小的ID先来),其余的响应保持不变。我记录了一些调试信息,并且非常肯定我的OnReceivedAsync覆盖每个请求发送一个响应。我在没有Redis消息总线的情况下尝试了相同的实现,并且遇到了同样的问题。本地运行(长时间轮询)然而取得了良好的效果,所以我怀疑问题可能在于消息总线缓冲消息的方式,以刷新可能没有被抓住的客户端,以及一些奇怪的与切割/设置与Nginx负载均衡器的连接,但除此之外,我非常茫然。

任何帮助,将不胜感激。

编辑:进一步的调查显示,重复发生在约20-30秒的有些规律的间隔。我被引导认为消息总线中的消息到期可能与该错误有关。

编辑:错误可以在这里看到:http://tinyurl.com/9q5t3va
服务器只是广播客户端发送的计数器。你会注意到一些响应每20个左右重复一次。

+1

在github上使用repro和repro步骤解决问题。 – davidfowl 2012-08-06 15:40:26

+0

无法在本地重现此错误。当(如果)我能够做到这一点时将提交报告。 – 2012-08-07 10:43:51

回答

1

将IIS(6.0)服务器管理器中的工作进程数从2减少到1解决了这个问题。