簡體   English   中英

同一訂戶在不同計算機上的多個實例

[英]Multiple instances of the same subscriber on different machines

我正在嘗試使用Nservice總線實現發布者訂閱者模式,我想要做的如下:

我有Web應用程序,用戶可以使用他的帳戶編寫新聞並向該應用程序添加文檔。

我有一個在用戶計算機上運行的Windows窗體桌面應用程序,他們可以使用與訪問Web應用程序相同的憑據登錄此桌面應用程序。

我需要做的是,當Web應用程序上的用戶添加新聞或documnets時,已安裝的桌面應用程序應收到通知,以通知它有關此添加新聞的信息...

我想象我的桌面應用程序將是訂閱者,它將訂閱將從服務器發布的事件,我需要知道的是

當有多個用戶(例如1000個用戶)時,將此台式機應用程序安裝在不同的計算機上以開始使用它,在這種情況下,Nservice總線會將其視為多個訂閱者,並將消息副本發送給其中的每個訂閱者,或者向他們發送消息嗎?

文檔中所述 ,它的工作方式如下:

  • 如果使用Send(ICommand command) ,則將消息直接發送到匹配的目標。 在這種情況下,如果您有多個消費者,則他們將競爭獲得此消息,而只有一個獲得。 通常用於擴展應用程序。
  • 如果您執行Publish(IEvent @event) ,則您的消息將傳遞給所有訂閱者。

當NServiceBus中發生發布/訂閱時,將有一個邏輯發布者將事件發送給多個邏輯訂閱者。 每個邏輯訂閱者將僅收到每個已發布事件的一個副本。

如果許多訂戶代表同一邏輯實體,則每個事件將僅由該邏輯實體內的一個訂戶處理。 如果兩個訂戶共享一個端點名,則認為它們代表相同的邏輯實體。

在這種情況下,如果桌面應用程序的每個實例都具有相同的端點名稱,則將它們視為代表相同的邏輯實體。 發布事件后,這些桌面應用程序實例中只有一個將獲得該事件的副本。 那可能不是您想要的。

如果為桌面應用程序的每個實例賦予不同的終結點名稱,則它們各自表示自己的邏輯實體。 發布事件后,所有桌面實例都將獲得該事件的副本。 那也可能不是您想要的。

要考慮的另一件事是NSB中的pub / sub是持久且可靠的。 如果啟動桌面應用程序並設置了訂閱,則即使桌面應用程序處於脫機狀態,該訂閱仍然有效。 即使您不再運行桌面應用程序,消息也可能會排隊等待桌面應用程序重新聯機以進行處理。 您的桌面應用程序是否需要這些應用程序,還是只關心連接時發生的事件?

如果要在服務器上發生事件時通知特定的訂閱者或在線的訂閱者子集,則在使用NSB之前我將使用SignalR。

附加信息


MSMQ和SQL Server不支持開箱即用的pub-sub,因此它們使用一種稱為消息驅動訂閱的功能。 消息驅動的訂閱通過使訂閱者在啟動時向發布者發送消息(或調用Subscribe() )來工作。 此消息包含發布者存儲的Reply To標頭,並用於發送已發布的每條消息的副本。

對於SQL Server傳輸,“ Reply To地址”將是端點的名稱。 這又映射到數據庫中代表消息隊列的表。 如果多個訂戶共享相同的端點名稱(並因此具有相同的表),那么他們將獲得它們之間的事件的一份副本,並將競爭查看哪個訂戶將其從隊列中拉出。

對於MSMQ,“ Reply To地址將是終結點的名稱和由@符號分隔的計算機的名稱。 這意味着每個訂閱將針對不同的地址。 事件發布后,每個訂閱者都將獲得它自己的副本。 如果多個訂戶代表同一邏輯實體(即,共享一個端點名稱),那么您應該在它們前面有一個分發服務器 當您執行此操作時,外發訂閱消息上的Reply To標頭將是分發服務器的地址。 發布事件后,它將始終轉到分發者,該分發者會將其交給一個(只有一個)工作人員進行處理。

Rabbit MQ和Azure Service Bus具有用於pub / sub的內置機制,但是它們的行為類似於SQL Transport。 邏輯訂閱者的一個實例將獲得事件的副本。

暫無
暫無

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

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