負荷分散のためにNginxプロキシの背後にあるサーバー上のメッセージバスとして、RedisでSignalRを使用しています。SignalRのPersistentConnectionクラスを使用して、同じ特定のグループに属するユーザーにメッセージをブロードキャストする簡単なチャットプログラムを作成しました。ユーザーはOnConnectedAsyncでグループに追加され、OnDisconnectAsyncで削除され、ユーザーからグループへのマッピングは決定論的です。
現在、クライアント側は何らかの理由で長いポーリングにフォールバックし(理由は完全にはわかりません)、クライアントが応答を待って受信した後に新しい接続をセットアップするたびに、一見ランダムに見えますが、サーバーは時々応答しますPOSTが1つしかないにもかかわらず、新しい接続は前の応答とすぐに一致します。
メッセージIDは正確に1つ異なる傾向があり(小さい方のIDが最初に来る)、残りの応答は同じままです。私はいくつかのデバッグ情報をログに記録しましたが、OnReceivedAsyncのオーバーライドが1つの要求ごとに1つの応答を送信していることを非常に確信しています。Redisメッセージバスなしで同じ実装を試しましたが、同じ問題が発生しました。ただし、ローカルで実行すると(長いポーリングで)良好な結果が得られたため、メッセージバスがメッセージをバッファリングして、追いつかない可能性のあるクライアントを更新する方法と、 Nginxロードバランサーとの接続ですが、それを超えて、私は非常に途方に暮れています。
どんな助けでもいただければ幸いです。
編集:さらなる調査により、重複は約20〜30秒のやや一定の間隔で発生することが明らかになりました。メッセージバスでのメッセージの有効期限は、バグと関係があるのではないかと思われます。
編集:バグはここで見ることができます:http://tinyurl.com/9q5t3va
サーバーは単にクライアントによって送信されているカウンターをブロードキャストしています。一部の応答が20程度ごとに重複していることに気付くでしょう。