2011-06-04 11 views
5

鑑於您有多個系統,它們通過事件進行集成,並且所有這些系統都使用事件源。你在哪裏存儲事件?將事件存儲在使用事件採購的分佈式系統中的位置?

在我來說,我有三個系統:

  • 一個網站,這是一個商店
  • 用於網站管理後臺的客戶,產品等
  • 會計制度

每當在其中一個系統中發生域事件時,該事件就會發布,並且可以由其他系統處理。所有系統都使用事件採購。

我在想你會在哪裏保存這些事件。當然,每個系統都必須存儲所處理的所有事件,因爲它使用的是事件源,因此取決於它曾經處理過的事件。

但是如果其他事件不需要,系統也不訂閱呢?我正在努力處理需求可能發生變化的事實,這樣一個系統就必須處理來自過去並不存在的事件。如果系統需要處理它在發生時沒有訂閱的事件,你會從哪裏得到這些事件?

我認爲對於目前不使用事件採購的系統有很大的區別。如果必須在依賴於數據的系統A中實現一個功能,這在A中不可用,但在另一個系統B中可用,並且您通過像NHibernate這樣的ORM工具持續保持當前狀態,則只需將該數據從A導入到B 。由於使用事件採購的系統依賴於事件以達到其當前狀態,因此您必須導入過去錯過但現在需要的所有事件。

對於我來說,這個問題有幾種不同的方法。

  1. 每個系統保存所有發佈的事件。這使您可以根據需要重新發布事件或將它們導入到另一個系統中。
  2. 每個系統保存所有發生的事件,即使那些不需要處理的事件(還)。
  3. 所有系統的所有事件都存儲在中央事件日誌中。如果您需要處理過去發生的事件,但您沒有訂閱,則可以從此處導入。

你是如何處理這種情況的?你在哪裏保存你的事件?

編輯

感謝羅伊Dictus你的答案。我仍然不知道如何處理以下情況:

該網站發佈事件CustomerRegistered,CustomerPurchasedProduct和CustomerMarkedProductAsFavorite。 在當前版本的後端客戶需要顯示並且他們的購買必須被顯示。在該版本的系統中,什麼是客戶標記爲最愛的東西並不重要。因此後端僅訂閱CustomerRegistered和CustomerPurchasedProduct。

現在營銷部門還希望在客戶詳細信息頁面上顯示有關最喜愛產品的信息。由於後端未訂閱CustomerMarkedProductAsFavorite,因此此信息在後端不​​可用。我從哪裏得到這些信息?

回答

3
  1. 每個系統都存儲自己的事件。每個系統都是自己的CQRS系統,或者至少是它自己的獨立服務,因此它負責自己的數據。
  2. 每個系統還將其活動發佈到服務總線。該服務總線確定它保存這些事件的位置。通常它是在一個事務性排隊系統中。
  3. 每個系統都訂閱它消耗的外部事件。它不存儲這些傳入的事件,只存儲它們自己產生的事件。當它消耗傳入的事件時,服務總線知道它可以從該服務的傳入隊列中刪除該事件。

編輯,以適應你的額外問題:

如果另一個應用程序突然變得興趣額外的信息,它具有偵聽器添加到它現在是在感興趣的事件

此外,所有。然後這些事件的來源可以重放這些事件。重放是事件驅動系統的一個強大功能,可以支持這種情況。因此,事件源僅重播所選事件(例如,過去6個月的所有CustomerMarkedItemAsFavorite事件)。已經消費這些事件的系統應該認識到重放的事件是「舊」事件(即它已經處理過的事件)並忽略它們。

通過這種方式,任何更新爲使用其他子系統的額外信息的子系統都可以在單個批處理操作中獲取該信息並獲得全部最新信息。

+0

謝謝。請參閱下面的我的編輯。我添加了一個我不知道如何處理的場景。 – Alebo 2011-06-05 08:57:35

0

WRT您的編輯:是否也需要訪問歷史CustomerMarkedProductAsFavorite數據。更改後端以訂閱新數據,然後繼續前進。如果您真的需要,您可以制定如何將缺失數據作爲單獨問題回填。

Roy已經概述了一種可能的架構,可以確保您將客戶標記的產品作爲收藏數據在未來回填。

+0

我只是做了這個例子。不過,我認爲這將是訪問歷史數據的要求,因爲無論誰在後端查看收藏夾,都會期望它們完整。 – Alebo 2011-06-05 09:44:43