我使用SignalR和Redis作爲位於Nginx代理之後的服務器上的消息總線進行負載平衡。我使用SignalR的PersistentConnection類來編寫一個簡單的聊天程序,它將消息廣播給屬於同一組的用戶。用戶被添加到OnConnectedAsync中的組中,並在OnDisconnectAsync中被刪除,並且用戶到組的映射是確定性的。目前,無論出於何種原因(我不完全確定爲什麼),客戶端都會回到長輪詢狀態,並且每當客戶端在等待並接收響應之後建立新連接時(看似隨機),服務器有時會對之前的響應立即響應新的連接,儘管只有一個POST。SignalR複製響應
消息ID往往會相差一個(較小的ID先來),其餘的響應保持不變。我記錄了一些調試信息,並且非常肯定我的OnReceivedAsync覆蓋每個請求發送一個響應。我在沒有Redis消息總線的情況下嘗試了相同的實現,並且遇到了同樣的問題。本地運行(長時間輪詢)然而取得了良好的效果,所以我懷疑問題可能在於消息總線緩衝消息的方式,以刷新可能沒有被抓住的客戶端,以及一些奇怪的與切割/設置與Nginx負載均衡器的連接,但除此之外,我非常茫然。
任何幫助,將不勝感激。
編輯:進一步的調查顯示,重複發生在約20-30秒的有些規律的間隔。我被引導認爲消息總線中的消息到期可能與該錯誤有關。
編輯:錯誤可以在這裏看到:http://tinyurl.com/9q5t3va
服務器只是廣播客戶端發送的計數器。你會注意到一些響應每20個左右重複一次。
在github上使用repro和repro步驟解決問題。 – davidfowl 2012-08-06 15:40:26
無法在本地重現此錯誤。當(如果)我能夠做到這一點時將提交報告。 – 2012-08-07 10:43:51