2012-12-26 27 views
13

我正在評估針對中等負載Web應用程序的SignalR。SignalR中的保證傳送

我們預計〜500 msgs/sec,這對SignalR來說應該不會有問題。

但是,我們擔心此解決方案的可靠性。我們的環境存在一個有問題的網絡,並且客戶端失去約30秒的網絡連接並不罕見。有沒有什麼機制可以確保一旦客戶端重新連接,它將獲得在其離線時間內發送的所有消息?

謝謝!

+1

如果您正在尋找100%保證交貨,SignalR不適合您的解決方案一個很好的候選人。你需要一個健壯的排隊系統。 – EkoostikMartin

+0

你應該考慮RabbitMQ(http://www.rabbitmq.com/)。即使客戶端無法從其中獲取消息,也可以在隊列中爲每個客戶端排隊消息。 – rpgmaker

+0

+1 EkoostikMartin。如果你正在尋找可靠的消息,你需要使用SignalR進行分層。 – davidfowl

回答

14

處理此問題的一個相當簡單的方法是爲每個消息分配一個隨每條消息遞增的ID。客戶需要跟蹤他收到的最新消息,並且在重新連接時只需將該消息ID發送給服務器;然後服務器需要將所有錯過的消息發送給客戶端。應該相當簡單的實施。

編輯: 我不認爲你必須維護服務器上的任何真實狀態 - 我認爲它幾乎可以推到你的數據存儲區或你的客戶端。該客戶端將發送了最後一條消息的ID或時間戳,它已收到:

$.connection.myHub.server.updateMe(lastMessageId);

你想要某種形式的支持數據存儲的 - 因此,當服務器接收到updateMe()消息時,它會做查詢數據庫並提取出ID大於剛剛收到的ID的所有行。它會將這些返回給客戶,作爲其UpdateMe()方法的返回值的一部分。然後,它會嘗試通過調用客戶端上的方法來傳遞與通常情況相同的新消息。

至於無狀態是SignalR的一個目標:我不能評論這一點,除了觀察我無法想象任何合理複雜的實際應用程序不需要做某種支持數據存儲,無論是在SignalR還是其他框架(WCF,XSockets等)上都沒有什麼區別。

+0

如何使用SignalR來實現這個功能?而且,這將迫使我在服務器上擁有一個狀態,這將會錯過SignalR的一個目標,成爲一個無國籍的fw。 – ml123

+0

查看我上面的編輯。 –

+0

@ ml123是否最終使用了SignalR?它運行良好嗎? Tks – Pascal

2

你可以ofcourse使用某種queing框架,但以最小的努力來實現這一目標,你可以做這樣的......

Serverside集團:http://pastebin.com/tuicQYGq 客戶方:http://pastebin.com/a8EbusuG

我使用XSockets.NET這是一個實時通信平臺(自2009年起)以及XSockets.NET中的控制器都有狀態,所以這很容易實現。

編輯:哦......要測試這個使用兩個瀏覽器,例如鉻和Safari瀏覽器,然後斷開一個瀏覽器...發送一些消息,然後重新連接,看到消息出現。您必須在本地主機上使用兩個不同的瀏覽器,因爲xsockets會爲每個瀏覽器提供唯一的存儲ID。

編輯:將Func添加到隊列中,這樣即使它們處於脫機狀態,您也可以鎖定特定的客戶端。現在只有符合條件的客戶纔會收到消息。

問候 Uffe