2014-10-03 93 views
0

我們的Safari移動客戶端受到signalr阻塞的5個連接之一的影響。我們使用的解決方案扶起這裏:https://github.com/SignalR/SignalR/issues/1406#issuecomment-14284093Signalr LongPollDelay和緩衝區

,我們有這些設置更改爲signalR 2.X以下

  • GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromMilliseconds(1000);
  • GlobalHost.Configuration.LongPollDelay = TimeSpan.FromMilliseconds(5000);

我們發送通知從服務器到客戶端沒有消息隊列或確認框架。我們不需要保證信息傳遞,但我們確實希望那裏有很高的成功可能性。我們認爲,這應該是可能的,因爲我們的低消息率和1000緩衝區大小但是有一些問題:

  1. 在隊列中的消息舉行,而LongPollDelay發生?在下次長時間輪詢期間,他們是否應該使用上述設置發送 ?
  2. 我們在2分鐘內發送單條消息的測試中,LongPollDelay建議在接下來的第二個長輪詢請求期間不檢索它們。 這是否有任何理由,即1分鐘後緩衝液沖洗?
  3. ConnectionTimeout會影響所有傳輸嗎?
  4. 如果ConnectionTimeout適用於所有傳輸,是否有一種方式 僅爲Safari移動用戶設置此選項,即有兩個連接 可用,並使用代理檢測指向特定連接?
  5. 有沒有設置LongPollDelay的方法,這樣也只有 只適用於Safari移動用戶?

所有建議歡迎和讚賞,馬特

[後續問題]

感謝那些幫助了很多。我們已經重試了30秒的LongPollDelay,並按預期工作。我有幾個後續問題可供您/他人關注:

1)在測試期間,我們還會看到客戶端大約每5分鐘向服務器發送一次ping請求。爲什麼ping時間間隔設置爲5分鐘,當斷開時間如此之短時,如果客戶端假定服務器通過備用機制斷開連接,則ping服務器的目的是什麼?

2)w.r.t.針對不同客戶的不同配置。我們是否可以不設置另一個SignalR端點並僅指定Safari移動設備?類似的迴應這篇文章: Can I reduce the Circular Buffer to "1"? Is that a good idea?

回答

1
  1. 你是正確的SignalR將排隊/緩衝消息。即使沒有配置LongPollDelay,SignalR也需要這樣做,因爲在客戶端進行repolling/reconnecting時總會有消息發送的機會。

  2. 如果客戶端在最後的DisconnectTimeout內沒有連接到服務器,SignalR假定客戶端已斷開連接。一旦DisconnectTimeout觸發,SignalR將調用OnDisconnected並清除屬於斷開連接的客戶端的任何消息緩衝區,以免泄漏內存。 DisconnectTimeout默認爲30秒,遠小於您配置的2分鐘LongPollDelay,因此可以解釋此行爲。

  3. ConnectionTimeout隻影響長輪詢,除非您已禁用保持活動狀態。如果禁止活動,它適用於所有的運輸。

  4. 無法爲特定類型的客戶端選擇性地配置ConnectionTimeout。但正如我所說,它只會影響默認的長輪詢。

  5. 沒有辦法爲特定類型的客戶端選擇性地配置LongPollDelay。

+0

謝謝,我添加了一個後續問題供您考慮。 – MattPil29 2014-10-06 09:22:02

+0

通常最好是將後續問題作爲新的SO問題提出,但我會在這裏回答。 1)Pings用於保持會話cookie活動,需要提出新的請求。 2)您可以配置多個端點,但是如果您希望端點與其他端點進行通信,則需要共享一個IMessageBus。這可以使用SignalR的IDependencyResolver來實現。請注意,兩個端點應該*不共享IDependencyResolver,只是IMessageBus。 – halter73 2014-10-09 21:26:28