2011-04-07 73 views
18

我們目前正在評估CQRS和事件源架構。我想了解使用這種設計的維護含義是什麼。有兩個問題,我苦苦尋找的答案是這樣的:如何管理CQRS +事件源架構中的ViewModel更改

1) 如果一個應用程序已經啓動並運行了一段時間後,出現了一個新的要求,以附加字段添加到視圖模型上會發生什麼ReadModel數據庫?假設客戶郵政編碼在CustomerList ViewModel上是必需的,它以前不是。所以,額外的列可以很容易地添加到ViewModel數據庫,但是如何填充?據我所見,唯一的方法是清除讀取數據庫,並從頭開始重放所有事件以構建備份ReadModel Datbase。但是,如果應用程序已經運行好幾個月或幾年(如我們所希望的那樣)會發生什麼。這可能是數以百萬計的活動重播,只是爲了添加一個郵政編碼列的數據。

我有同樣的擔憂,如果出於某種技術原因,ReadModel數據庫得到了同步,或者我們要添加一個新的ReadModel數據庫。它看起來應用程序越舊,使用的越多,越困難也越昂貴,這是最新的readmodel返回。或者我錯過了一個訣竅?像ReadModel快照?

2) 如果在所有數百萬事件被重放以構建備份讀取數據庫之後會發生什麼情況,其中一些數據與期望的(即,看起來錯誤)不符。人們認爲,在事件存儲或反規範化例程中某處可能導致了這種錯誤(似乎如果在編碼中有一件事可以依賴,那就是錯誤)。如何去調試這個!這似乎是一個不可能的任務。或者,也許,我再次錯過了一個竅門。

我很想從誰已經運行了這樣的系統,一會兒別人聽到,維護和升級路徑是如何制定出適合您。

感謝您的任何時間和輸入。

回答

16

使用事件與CQRS採購的美是摧毀讀取模型和從頭開始重建它,因爲已經提到的能力。出於某種原因,人們有這樣的想法,在超過一些任意數量的事件之後,需要很長時間。如果您正在使用關係數據庫作爲您的讀取模型(而且很可能是),則很容易打開一個事務,通過處理程序讀入所有事件,然後提交事務。只有在事務提交時我們實際觸及磁盤。其他的一切都在內存中執行,所以它可以閃電般快速。事實上,如果你的系統在幾分鐘內完成幾百萬個事件,我不會感到驚訝。從頭

重建你的閱讀模式應顯示確切的方式爲你的非規範化的事件到讀取模式的日常方法相同。如果不是的話,你的讀取模型非規範化代碼中有一個錯誤。這裏最重要的是從消息處理器的角度來看,在常規/生產場景和讀取模型重建場景期間,接收到的事件和非規範化到讀取模型中沒有區別。

如果遇到錯誤,你可以很容易地通過流/複製生產事件到本地工作站中,在處理程序設置斷點,然後運行通過你的閱讀模式處理代碼的那些事件進行調試。

+0

感謝您的回覆。你對事件重播時間的看法不成問題(即使對於數百萬事件)也令人放心。我喜歡你的博客BTW,感謝分享! – James 2011-04-08 12:47:12

+1

你肯定會想做一些測試,因爲如果你做錯了,視圖模型總體*會變得很慢。需要一點點努力才能使其變得更快。 – 2011-04-08 18:27:47

+0

我們一直在實踐或重建我們的每一次推動生產的閱讀模型。我們首先重建數據,將其推送到我們的階段讀取模型,如果重建成功,我們將重建並將其推送到我們的生產讀取模型。對我們來說,它確保了讀取模型反映了每個版本中對事件處理程序的所有修改。 – 2011-12-06 19:19:18

1

我有點新的CQRS,所以這可能不是最明智的路線(但IIRC我把它撿起來從CQRS/DDDD的郵件列表)。

我們創建特定於預期運行一次則不贊成使用爲目的的命令和相應的處理程序。

在處理程序中,我們使用任何機制都很方便,所以在您添加郵政編碼字段的情況下,我們可以運行一次性查詢,從另一個視圖模型中提取郵政編碼並填充新列。我們並不擔心這些情況下的架構純度,因爲它預計是一次性操作(在這些情況下,Rob Conery's Massive已成功使用)。

1

我現在還沒有使用與事件採購CQRS生產就緒的應用程序,所以這裏只是我的經驗試圖建立一個。

1)Read Model rebuild。是的,你基本上必須重建整個Read Model DB,只要其中的某些內容發生變化。如果有很多事件,這可能需要很長時間。因此讀取模型重建必須高度優化(使用事件批處理等)。當讀寫比率高時,我認爲事件採購最適合。因此,對於一些非常易變的數據,最好不要將其存儲爲域事件。但是關於存儲容量的問題也不是那麼遙遠。無論如何,您可以將cqrs應用於系統的一部分,即最適合的部分(例如,我可能不會將圖形圖像存儲爲事件的一部分)。

2)Debugging。 在事件存儲過程中出現錯誤(這應該是一個框架的問題)是非常不可能的,並且始終很容易檢查存儲中的事件。至於產生預期事件的命令,你應該在這裏進行測試,這些測試可能是系統中最有價值的測試。對於denormalizers,你也可以進行測試,但是如果它們的核心特性可以用肉眼看到,我就不會爲平凡的非規範化器編寫測試。話雖如此,我曾多次使用調試器來發現一些更復雜的非規範化器中的問題;試圖確定哪些事件會使事情出錯是沒有多大意義的。

0

它也可以在網事件中添加你的模型。這可以作爲一個任意的任務運行X事件後收到(比如說500)

要重建,你推動你的事件到堆棧上,直到你擊中網絡事件,這將被用作基線,從這裏您將事件從您的堆棧中彈出,並將它們的值與您的基準事件進行彙總。

相關問題