2013-12-21 61 views
2

我看過並閱讀了一些關於CQRS的教程,但他們都沒有使用現實世界的例子,所有這些(使事情很簡單)只有一個內存事件存儲 而在這個例子中,獲取對象的當前狀態以「重放」事件很容易且快速。例如與SQL數據庫。 比方說,我有一個用戶的系統。CQRS,仍然沒有完全得到它,什麼是保存在數據庫中;(

而且我有UI在那裏我可以添加和編輯的用戶,還能得到所有用戶的列表。

現在,根據教程的說法,我將事件保存在數據庫中,假設每個用戶在他們的個人資料上有3個變化,並且我們有100.000個用戶。

現在我有一個GetById回購。 在一個正常的非CQRS系統中,我根據Id獲得一個記錄。 快速和小的資源使用情況。

但是現在在CQRS系統上,我必須從數據庫加載3條記錄,並將它們應用到新的用戶對象上,並返回這個......這不是那種性能,但是我可以說:「也許生活在這裏,因爲伐木的好處等等。「

但是,我如何在一個頁面上顯示50個用戶的列表用戶場景。 50倍x 3條記錄,每頁點擊此? 而這不僅對於客戶,可能是發票,預訂等等,這是什麼資源浪費?

對於CQR​​S/EventSourcing,我會得到一些完全錯誤的東西嗎?或者我有這個drawbag的生活嗎?

親切的問候

回答

6

非規範化讀取模型/持久化視圖模型就是你所缺少的。 CQRS的主要優點是能夠以不同的方式處理讀寫操作,並對它們進行不同的優化。你會加載聚合與事件寫入。對於讀取,您的系統只會讀取爲此目的而創建的表格。該表也許SQL或的NoSql,可能不涉及聯接等

參見Microsoft模式和實踐CQRS旅程例如http://msdn.microsoft.com/en-us/library/jj554200.aspx

+0

我知道CQRS是關於分離讀寫的,這是它的重要部分。但之後的一切對我來說都不清楚。 一個微小的現實世界的例子會很棒。 UserAggregat中的UpdateUserCommand觸發事件UserUpdatedEvent,該事件將被序列化存儲在事件SQL表中。 我也得到了這部分。這是寫入方面。 但是,我該如何處理Read方法,是否存在User表,或者沒有(僅限事件表),如果有的話,該命令是否不僅插入到事件表中,還會更新用戶表中的用戶?讀取只與用戶表一起工作? – SharpNoiZy

+0

從MS的樣本看它涵蓋了所有這些。可能有一個或多個用戶表被設計爲顯示需要的信息。該事件可以由一個或多個更新其他視圖的處理器來處理。這些視圖通常非常簡單,並且可以通過再次通過處理器運行事件來丟棄數據並重建視圖 – GraemeMiller

2

我認爲(和我在CQRS我要指出的是新手)的關鍵,想着這就是分裂讀取數據和寫入數據的概念。在你的情況下,你需要創建一個可以爲你的列表頁面讀取的數據存儲。當寫入事件存儲區時,該存儲區將是隻讀和更新的,甚至可以通過重播所有事件(例如,如果它已損壞)來重新創建。

1

葉氏,你錯了。查詢時不能使用寫入端。您必須使用響應域事件的偵聽器(可能是異步的)創建非規範化存儲。然後使用此存儲進行快速查詢。

相關問題