2013-06-27 58 views
2

我正在使用PersistentConnection向連接的客戶端發佈大量數據(許多小包)。它基本上是單向的數據方向(因爲每個客戶端將調用其他服務器上的端點來設置各種訂閱,所以它們不會通過SignalR連接將任何數據推送回服務器)。如何在服務器端節制SignalR客戶端

有什麼方法可以檢測到客戶端無法跟上發送給它的消息嗎?

這個例子可能是一個連接不好的移動客戶端(例如在漫遊的情況下,速度可能會有很大的變化)。如果我們每秒發送100條消息,但客戶端只能處理10條消息,則最終會丟失消息(由於服務器端的消息緩衝區)。

我正在尋找一個服務器端事件,類似於(SignalR)客戶端上完成的事件,例如,

protected override Task OnConnectionSlow(IRequest request, string connectionId) {} 

但是,這不是框架的一部分(出於好的理由,我假設)。

我已經考慮過使用這個方法(在Stackoverflow的其他地方建議),讓客戶端告訴服務器(例如每10-30秒)它接收了多少消息,如果這個數字與數量有很大區別發送給客戶端的消息,很可能客戶端無法跟上。

該事件將用於告知分佈式後端客戶端無法跟上,然後關閉數據生成速率。

+0

好問題。我剛剛發佈了一個類似的話,然後看到你的問題。 –

回答

1

除了編寫自定義的東西之外,現在還沒有辦法對此進行此操作。過去我們已經討論過這個潛在特徵,但它現在不在任何地方。目前還不清楚「慢」是什麼意思,因爲它取決於應用程序的決定。可能會有某種基於帶寬/時間/消息的設置,這會使此假設事件觸發。

如果你想在非常低的層次上掛鉤,你可以使用owin中間件來替換客戶端的底層流,以便你可以看到所有的數據都在寫入(你會必須爲websockets做同樣的事情,這可能不是微不足道的)。

一旦你有了這些,你可以編寫一些基於時間的邏輯來確定flush是否花了太長時間並以這種方式殺死客戶端。

這非常模糊,但它基本上是一個這樣的功能如何工作的大腦轉儲。

+0

感謝您的快速回復 - 我沒有想到您手邊有一個小小的解決方案,但很高興知道它已經被考慮和沒有計劃。我可能會把它保留下來,如果我們發現那個方向有問題的話,我會把它拿起來。 – cwt237