2012-10-01 47 views
9

根據http://cre8ivethought.com/blog/2009/11/12/cqrs--la-greg-young,負責使用事件發佈者發佈事件的組件是存儲庫。爲什麼CQRS存儲庫發佈事件,而不是事件存儲?

我的問題很簡單:爲什麼?

在這篇博客文章中,我們被告知:

域名庫負責發佈的事件,這通常是一個單獨的事務中一起存放在事件存儲的事件。

我以爲這是一個事件存儲的任務:一旦事件(或多個事件)被存儲,它就會被髮布。

那麼爲什麼它在存儲庫?

回答

9

您的域模型不知道存儲機制。另一方面,無論您使用事件存儲庫,傳統SQL存儲庫還是任何其他持久性方法,它都必須確保發佈適當的事件。

如果您依賴事件存儲來發布事件,那麼您將與存儲機制緊密耦合。

+0

由於事件和事件發佈的存儲需要是原子操作,同時還避免2PC,正如你提到的,這些事件的出版不該不是底層事件庫的責任,而是在設置「未發佈」標記時使用數據庫表來存儲事件的解決方案。讓另一個進程從該表中讀取標記爲「未發佈」的事件,然後發佈它們,之後設置標記並確認事務?如果是這種情況,是否爲未完成的事件輪詢該表以完成此事? – CraigM

2

存儲和發佈事件必須是原子指令,因爲如果兩個操作之一失敗,此事件的偵聽器將與事件的生產者不同步。

與從事件存儲中發佈事件(使用2pc事務(兩階段落實))相比,存在另一種(更昂貴的)解決方案。

你可以找到一些intereting信息在這裏:https://cqrs.wordpress.com/documents/building-event-storage/

相關問題