0

我将 SignalR 与 Redis 一起用作位于 Nginx 代理后面的服务器上的消息总线,以实现负载平衡。我使用 SignalR 的 PersistentConnection 类编写了一个简单的聊天程序,该程序将消息广播给属于同一特定组的用户。用户在 OnConnectedAsync 中添加到组中,在 OnDisconnectAsync 中删除,并且用户到组的映射是确定性的。

目前,无论出于何种原因,客户端都会退回到长轮询(我不完全确定为什么),并且每当客户端在等待并收到响应后建立新连接时,似乎是随机的,服务器有时会响应尽管只有一个 POST,但新连接会立即与先前的响应建立连接。

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

任何帮助,将不胜感激。

编辑:进一步的调查表明,重复发生在大约 20-30 秒的定期间隔。我被引导相信消息总线中的消息过期可能与该错误有关。

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

4

1 回答 1

1

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

于 2012-08-08T04:27:30.597 回答