2013-03-15 61 views
1

我剛剛下載了joliver事件存儲庫並希望通過Windows Service Bus 1.0連接一個服務總線,以實現跨越多個有界上下文進程的應用程序。停機後消息總線與有界上下文的重新同步 - 服務總線1.0

如果在創建其他有界上下文中的事件(或者甚至可能是已部署的新上下文)時,有界上下文已脫機,則可以看到以下事件序列。

  1. 有關示例ContextA,ContextB和ContextC,全部使用服務總線1.0,並用自己的事件存儲每個上下文連接,它們都共享相同的總線消息底板。
  2. ContextC離線。
  3. 當ContextC進行備份時,需要將其他有界上下文通知需要重新發送到剛剛恢復聯機的上下文的事件。這些事件將從每個事件商店重播。

我的問題是:

  1. 上述場景將適用於任何情況下采購庫,所以有關於這一點,我可以使用頂部的任何基礎結構代碼,還是我必須推出自己的?
  2. 對於Windows Service Bus 1.0,如何將序列號與我的事件存儲區中的序列號結合到Service Bus上的序列號?
  3. 檢測和處理已經以安全方式接收的事件(防止消息處理程序失敗)的最佳做法是什麼?
+0

這個問題問得更多的交代你擴展到包括其它更多的假設之前!雖然有一個裂縫... – 2013-03-16 20:54:44

+0

任何我需要減少讓我知道,我會編輯...所有即時通訊真的是一種方式來同步離線有界上下文,我擴展了我的想法。可以刪除,如果將有助於澄清問題 – g18c 2013-03-16 21:09:01

+0

也許考慮切斷跨BC的事件分佈(你優化DIY酒吧子impls)出這個問題,並單獨要求它,因爲它與事件存儲沒有多少關係,並將使它更容易混淆你得到有用的答案你的主要問題。 – 2013-03-16 21:12:22

回答

2

上述場景將適用於任何情況下采購庫,那麼有沒有對這個我可以用頂部的任何基礎結構代碼,或者我必須推出自己的?

與事件相關的投影機制的概念當然很常見。不幸的是,根據您的堆棧,性能要求和規模以及許多其他因素,可以採取多種方式處理可能的操作。

因此,我不知道這種性質的商品化設施。

GetEventStore商店有一個集成的投影設備,它看起來非常強大,並需要從桌面上構建所有這些。在它存在之前,我曾經爭辯說,甚至不應該考慮過去JOES的SRPness。

除了提到Azure之外,你還沒有多說你的實際堆棧。

對於Windows服務總線,如何將序列號與我的事件存儲區中的序列號結合到服務總線上的序列號?

可以使用流ID +提交的序列號的MessageId(並用它來確保重複通過總線移除)。您可能還會在Message元數據中包含屬性。

檢測和處理已經以安全方式收到的事件(防止消息處理程序失敗)的最佳做法是什麼?

如果您使用的是Azure並考慮ServiceBus,那麼主題可用於確保至少一次交付(並且您將使用會話工具)。去觀看two hour deep dive ClemensV Subscribe video加上其他一些事件,否則你會花時間犯錯誤相同金額)

爲了使廣播流量降低,如果ContextC請求從ContextA和ContextB重播,有沒有辦法爲這些重播消息只發送給ContextC?還是我不應該擔心這個?

畝。你開始問這個東西是否是一個好主意,但現在似乎已經假設它是一條好路徑。

首先,這些基礎設施是一個巨大的車輪重新塑造。你是否考慮過簡單地爲每個BC設置一個話題,讓任何需要傾聽的人聽?

這裏關鍵的一點是,您需要牢記這樣一個事實,就是因爲您可以考慮BC需要消費其他事件的情況,這種隨處可見的中央魔法巴士將隨處提供一切。


編輯:答案的問題2+

隨着Windows服務總線1.0的版本的編輯,我怎麼嫁給我的事件存儲序列號,以在服務總線的順序編號?

你的事件商店可是沒有一個序列號。它具有每個聚合的提交序列號。您通常會使用會話主題和訂閱。然後,您需要選擇是否需要全局排序(使用單個會話ID)或每個聚合排序(使用流ID作爲會話ID)。

一旦事件是一個主題,他們有一個MessageSequenceNumber和訂閱(sessioned時)開出(實際上是用戶臨危它們)它們的序列。

檢測和處理已經以安全方式收到的事件(防止消息處理程序失敗)的最佳做法是什麼?

這是內置於服務總線(或任何排隊機制)。在成功處理之前,您不會標記消息已完成。任何失敗都會導致放棄(將其放回隊列以進行再處理)。

訂戶休息一會,成爲斷線或工作備份由主題自然處理。