2012-04-17 84 views
4

我們正在開始一個新項目,我們希望在MongoDB中實現CQRS +事件採購架構。我們已經有了CQRS方法的一些經驗:在我們之前的項目中,我們以Fohjin框架爲出發點(當然,我們對它進行了重構)。在這種情況下,我們使用Oracle作爲存儲,並使用TransactionScope實現了2PC。CQRS,事件採購和NoSQL數據庫

但是對於我們的新項目,由於其可擴展性和性能,我們希望使用MongoDB。我們肯定希望將它用於閱讀(報告)部分並將其用於事件存儲。這裏的另一種選擇是使用SQL Server進行事件存儲。所以我們需要做出選擇。我不喜歡混合解決方案的是TransactionScope,它很昂貴且速度很慢,並且需要支持不同的Db類型(Mongo和SQL)。

我們研究了NCQRS,但似乎我們不想高度依賴任何框架,這就決定了很多可以從我們的角度實現的東西。所以現在我們正在考慮像Jonathan Oliver的Event Store這樣更輕量級的東西。我喜歡stream和commits的概念,它也支持MongoDB。我仍然不明白,它如何處理所有2PC的東西(據說,對於NoSQL)。在我們的例子中,我們需要將事件分派給幾個事件處理程序:某種denomerizer,它爲某些類型的事件更新讀取數據庫和任務sheduler。如果這些處理程序出現問題,並且我們得到了一個exeption,那麼無法回滾MongoDB的提交。有沒有處理這個技巧?

我很欣賞任何關於如何做出正確決定的意見,以及有什麼優點和缺點。

回答

4

EventStore使用Guid唯一標識對數據庫的提交,以防止同一個事件流不止一次被持久化。通常,這個Guid直接嵌入到消息中,唯一標識特定的消息,並且可以在事件流上調用CommitChanges時用作CommitId。在處理系統查詢端的事件時,您可以使用類似的方法。

上2PC一些更多的信息,避免分佈式事務:

+0

謝謝您的回答,埃利奧特。據我所知,我需要使我的事件處理程序/管道鉤子idempotent,添加某種過濾器,將確定事件/提交已分派。這聽起來像爲每個處理程序添加了很多額外的代碼(也許它可以作爲一個方面或類似的東西來實現)。 Busides,它爲每個處理程序添加一個新的數據庫查詢來檢查。但是,好的,我們可以稱之爲「解決方案的成本」。另一個問題是何時處理部分處理的事件/提交? – Voice 2012-04-19 05:05:59

+0

是的,您需要構建基礎架構以使您自己的事件處理程序具有冪等性。一種方法是在您的活動中嵌入一個唯一的ID,並在您的閱讀模型中包含此ID - 然後您將能夠判斷您是否已經多次處理一個活動。 – 2012-04-19 11:57:45