簡體   English   中英

使用NServiceBus實現一個發布-訂閱通道

[英]Implementing a A Publish-Subscribe Channel using NServiceBus

我正在嘗試使用NServiceBus實現發布-訂閱頻道。 根據《企業集成模式》一書,“訂閱-訂閱”通道被描述為:

發布-訂閱通道的工作方式如下:它具有一個輸入通道,該輸入通道分為多個輸出通道,每個訂閱者一個。 當事件發布到通道中時,發布-訂閱通道會將消息的副本傳遞到每個輸出通道。 通道的每個輸出端只有一個訂戶,該訂戶只能消耗一條消息。 這樣,每個訂戶僅獲得消息一次,並且消耗的副本從其頻道中消失。

Hohpe,格里戈爾; 伍爾夫·鮑比(2012-03-09)。 企業集成模式:設計,構建和部署消息解決方案(Addison-Wesley簽名系列(福勒))(Kindle位置2880-2883)。 培生教育。 Kindle版。”

http://docs.particular.net/samples/step-by-step/中有一個包含發布者和訂閱者的示例。 我已經為版本5構建了示例解決方案。然后,我在不同的命令行窗口中運行了多個訂閱者,以查看系統的行為。

即使有多個訂閱者,也只有一個訂閱者接收已發布的事件。 發布多個事件將導致最多一個訂戶處理該事件。

我找不到有關如何將NServiceBus配置為引用文本中定義的發布-訂閱通道的任何信息。 有誰知道如何做到這一點? 不支持嗎?

[2016年2月2日更新]

復制訂戶后,我沒有重命名端點。 那給了我想要的行為。

如果您正在運行同一訂戶的多個實例,那么您所描述的是預期的功能。

情境

1個發布者,1個邏輯訂閱者

在此處輸入圖片說明

某些處理器發布事件,並且電子郵件處理程序已訂閱該事件。 當事件由電子郵件處理程序使用時,電子郵件處理程序將發送一封電子郵件。 在這種情況下,只有一個邏輯訂閱者,即電子郵件處理程序。 因此,僅發送事件的一個副本。

1個發布者,2個邏輯訂閱者

在此處輸入圖片說明

在下一個場景中,有兩個邏輯訂閱者:發票處理程序和電子郵件處理程序。 當處理器發布事件時,將發送該事件的兩個副本。 一種是發票處理程序,另一種是電子郵件處理程序。

1個發布者,1個邏輯訂閱者的2個實例

在此處輸入圖片說明

在這種情況下,即使有兩個服務訂閱了該事件,也只有一個邏輯訂閱者。 在這種情況下,僅發送事件的一個副本,並且只有一個電子郵件處理程序將處理該事件。 如果兩個電子郵件處理程序都處理了該事件,那么您將對N個訂閱者實例執行N次操作。 換句話說,將發送兩封電子郵件,而不只是一封。 這種情況最有可能需要兩個電子郵件處理程序,因為單個處理程序無法跟上處理器的負載,或者冗余是必需的。

摘要

如果只是簡單地旋轉同一訂戶的多個實例,則仍然只有一個訂戶處理該事件。 這是設計使然。 否則,該工作將在每個其他過程中重復進行。

如果要查看兩個邏輯訂閱者,請在該解決方案中使用不同的名稱創建一個新項目,並訂閱相同的事件(通過代碼或使用配置文件)。 然后啟動發布者和每個訂閱者的一個實例。 發布者發布事件后,您將看到兩個訂閱者都在處理事件。

訂戶需要首先啟動才能發送他們有興趣訂閱事件的消息。 然后,發布者需要啟動,有時間處理訂閱消息。 存儲所有訂閱后,您才能發布消息。 如果您在實際存儲所有訂閱之前發布消息,則NServiceBus只會將消息發送給它已經知道的訂閱者。 一秒鍾之后,所有訂閱者可能都知道了,但是到那時您已經發布了消息。

當使用持久性持久性(如SQL Server或類似的東西)時,訂閱將被存儲和保留。 因此,在重新啟動服務后,立即會知道所有訂戶。 使用內存存儲,每次重新啟動發布者時,訂閱都會丟失。 因此,需要稍等片刻,直到所有訂閱完成為止。

並不是每個訂閱者實際上都在發送消息,這可能也是一個問題,因為您可能配置錯誤。

我自己寫了一個教程 ,可能也會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM