2014-09-29 15 views
2

我想了解如何創建我自己的IMessageHub。我不想依賴任何額外的基礎設施,並且消息數量很少。所以我決定使用一個簡單的套接字解​​決方案來複制這些消息。我查看了不同ScaleoutMessageBus實現的源代碼,但這些似乎需要額外的嚴格增加的標識符(例如,Redis實現使用'INCR')。有人可以證實這是事實嗎?隨機標識符不會削減它?基於ScaleoutMessageBus的Signalr背板需要一個遞增的標識符?

標識符是第二個參數OnRecieved方法下面

public abstract class ScaleoutMessageBus : MessageBus 
    { 
... 
    protected virtual void OnReceived(int streamIndex, ulong id, ScaleoutMessage message) 

回答

2

你是正確的,該標識符應該嚴格遞增。

這用於使SignalR客戶端可以擁有它們收到的最後一條消息的全局標識符。當SignalR客戶端重新連接到另一臺服務器時(這在長輪詢傳輸中尤爲常見),它們會將此標識符傳遞給新服務器,以便它可以發送重連客戶端從內存緩存中錯過的任何消息。

如果標識符降低,SignalR將繼續運行,但每個服務器都會立即刷新接收到的消息的內存緩存。這可能會導致重新連接客戶端以錯過消息。

要知道爲什麼SignalR需要這樣操作,可考慮從scaleout提供商來跟以下順序標識符的消息:

1, 2, 3, 1, 2, 3 

然後,假設一個客戶端重新連接到不同的服務器稱其收到的最後一個識別碼是「2」。服務器無法用消息做出響應,而不會冒發送重複或丟失消息的風險。使用SignalR的設計方式,客戶端不應該收到重複項,但會錯過消息「3,1,2」。