2010-06-01 52 views
5

在試圖讓我的頭繞過CQRS(以及一般的DDD)時,遇到兩個事件發生在不同集合上的情況,但它們的順序具有領域含義。如果是這樣的話,那麼他們可能會發生如此緊密的聯繫,以至於一個時間戳(正如我看到的示例實現所使用的)無法區分它們,這意味着事件存儲不包含該域的「完整」表示,因爲該訂單存在歧義在哪些事件發生。在CQRS(事件源)中,是否需要事件存儲中的全局序列計數器?

舉個例子,域可以觸發一個CustomerCreatedEvent應用於所Customer彙總,然後在Agent骨料CustomerAssignedToAgent事件。如果事件發生在CustomerCreatedEvent之前,則CustomerAssignedToAgent事件沒有意義,但通常這兩個事件可能由於一次操作而被解僱,這使得時間戳可能實際上是相同的。

所以,我只是建模事情很糟糕?是否應該存在一種情況,即不同總量的事件序列是重要的?還是應該在活動商店中保留一個全局序列號,以便確定事件發生的確切順序?

回答

5

一般來說,執行全球秩序是個壞主意。聚集意味着形成ACID語義邊界。

這意味着兩個聚合不應該在一個事務中更新,並且沒有其他方法來執行全局秩序。

在你的情況下,它可能是有意義的,隨着創建CustomerCreatedEvent客戶應發送消息給代理聚合告訴它分配自己。通常應該通過消息傳遞來進行集合間通信。

+0

謝謝Szymon,我認爲這是最有可能的情況! – 2010-06-02 12:33:39

+0

我已經閱讀了很多次,但是...當你使用EventStore作爲隊列來消費來自其他有界上下文的事件,或者甚至是在生成它們的同一個BC時,如何確保你獲得它們爲了?你不需要它們,但是你至少需要能夠從給定的偏移量中消耗它們。 – Papipo 2014-06-17 18:01:22

5

我也domaindrivendesign雅虎名單上找到this post by Greg Young

順序僅爲每一個處理程序放心的聚合根邊界內。

處理程序之間或集合之間沒有訂單保證。

試圖提供這些東西導致黑暗的一面。

相關問題