2012-01-26 88 views
7

我正在開發一個支持從各種硬件類型接收狀態信息的系統。每個硬件都報告相同的狀態信息(經度,緯度),但每種硬件類型都使用唯一的協議報告此信息。出於這個原因,我有多種服務,每種設備類型一個,監聽和解析該設備的協議。我想對於每個服務使用一個共同的信息發佈狀態信息:NServiceBus終端可以訂閱同一消息的多個發佈者嗎?

public interface IPositionMessage : IMessage 
{ 
    string UnitName { get; set; } 
    double Latitude { get; set; } 
    double Longitude { get; set; } 
} 

我毫不費力就建立我的第一個服務,但是現在,我建立我發現,我的第二個服務我的訂閱者無法訂閱來自多個發佈者的相同消息。

以類似question on the NServiceBus yahoo group,推薦的解決方案是將公共消息轉換成命令,並使用Bus.Send而非Bus.Publish。在這種情況下,我不覺得這是有道理的,因爲真正發生的事情是一個事件(該單位已經到達一個位置並正在報告新的位置)。如果我要把它轉換成一個命令,我需要事先知道這個事件的所有潛在用戶,但我不知道。另一種可能的解決方案是創建一個聚合/重新發布者,每個服務將總線發送到,然後該消息將從單個發佈者重新發布。這似乎是不必要的瓶頸。

有沒有什麼方法來允許用戶訂閱來自多個發佈同樣的信息?

+0

AFAIK,這是不好的做法,從多個邏輯出版社出版。 –

+0

在我看來,每個服務都是作爲一個邏輯發佈者的一部分參與的物理節點。如果我有一個服務實現,並且我需要擴展到在第二臺計算機上安裝它,我的情況將不會有所不同。 – JadeMason

回答

12

這是事情的SOA「的成功坑」是烏迪試圖使它很難讓你逃脫之一。

基本的二元性是這樣的:

  • 命令應許多客戶通過單一權威來源發送和接收。
  • 活動應由單一權威來源出版並由許多客戶收到。

但這單一權威源是LOGICAL權威來源。重要的一點是,如果我對所有IPositionMessage數據感興趣,那麼應該只有一個邏輯點(queuename @ servername)發送我的訂閱請求。

這並不意味着同一邏輯服務內的多個物理處理器不能全部發布同樣的事件類型,只要他們發佈的內容具有權威性。

關鍵是所有的物理處理器必須共享相同的訂閱存儲。實際上,您可能希望有一個物理端點僅處理訂閱請求,根本不處理。它只接收訂閱請求(QueueX @ ServerY對IPositionMessage感興趣)並更新訂閱存儲。

然後,每個處理器連接到相同的訂閱存儲,去發佈IPositionMessage和會發現,QueueX @的servery有興趣,併發送事件的副本到該位置。

在NServiceBus.Lite配置文件運行的情況下,在dev環境中這將會有點難以吞下去,因爲訂閱存儲是默認情況下在內存中的,所以顯然它不會被共享並且看起來不會正常運行,所以要爲此做好準備。

+0

你對我的鬥爭,這是我希望能找到使用一個獨立的輸入隊列(讓每個協議的實施可能獲得獨特的配置命令),每個物理節點的方式直接命中,並在同一時間有各自的這些節點充當邏輯發佈者的物理節點(每個節點是該事件的權威發佈者)。我創建了一個非常簡單的「republisher」,用於處理要發佈的消息並將其發佈給所有訂閱者。乍一看,它仍然感覺像一個黑客,但我可以看到這是如何分離關注,並仍然可以擴展。 – JadeMason

+0

有沒有一個如何配置這種方式的例子?對於如何解決這個問題我有點困惑。 –

+0

不要緊:p非常直截了當。它只需要設置,以便所有相關端點都在查看相同的Raven DB數據庫。我會假設在MSMQ存儲的情況下,它必須指向同一隊列。 –

1

儘管可以訂閱多個發佈者(這可以在<unicastBusConifg />中配置),但我同意用戶組,因爲這應該成爲邏輯發送而不是發佈。

我不太清楚爲什麼我這麼認爲。

相關問題