2011-06-29 85 views
1

我正在使用自己的CQRS模式實現將舊項目遷移到CQRS。我開始這種遷移的主要原因是爲了擺脫n層架構造成的混亂。然而,與其他許多項目一樣,該項目正在使用關係數據存儲。將關係數據遷移到事件存儲庫

在這個過程中的當前狀態是我有更改和查詢對象隔離查詢的命令。這意味着從客戶端到服務器端,我使用CQRS-ish方式來更改和查詢數據,儘管我沒有從更改中發佈任何事件,也沒有非規範化的讀取存儲。我應該提到,我也有非常貧血的DTO作爲我的「領域模型」。所有的行爲都分佈在整個n層中,包括處理程序,管理人員和所有可怕的層次事物。

我想知道如何才能進行下一步。我現在想要的是開始建立一個負責其行爲的領域模型,其原因是我想開始使用事件存儲作爲真相的來源,它將我帶入我的問題:

如何將關係數據存儲中的數據遷移到事件存儲中?

我有一個極其規範化的數據模型,其中包含非常重要的數據,這些數據必須進行遷移。我明白,我不能期望從數據中捕獲任何意圖,因爲它已經死了,但我該怎麼處理它?我應該創建大量遷移命令嗎?很高興聽到你的經驗。

回答

5

我已經沒有機會嘗試這個東西,但我想嘗試在多個階段將工作:

  1. 首先繪製出所有的事件,系統會需要。
  2. 接下來介紹關係數據庫中的視圖來表示事件。
  3. 編寫自定義實用程序以從視圖中選擇以構建正確的事件對象。
  4. 讓自定義實用程序以正確的順序將事件對象寫入事件存儲區。
  5. 最後確保從事件存儲刷新非規範化視圖模型。

我會想象事件寫入事件存儲的順序有點棘手,需要一點思考。但看到這是一個遷移過程,那麼只要域的最終狀態是正確的,我認爲這不重要。如果你的關係表有時間戳,那麼這可能會有所幫助。

我認爲構建事件對象更合適,而不是創建命令,因爲關係數據表示過去發生的操作的域。

0

第一步,我會根據域驅動設計原則創建豐富的域模型來繪製聚合邊界。然後進一步向事件採購過渡將非常簡單。一些有關此主題的帖子Here are

0

對於提供的解決方案,Id的做法有所不同。我已經在兩個不同的項目上完成了兩次遷移。

您的第一步是使用命令執行寫入操作和查詢來完成讀取操作,這是第一步。

我會做的下一件事是從寫入的相同命令引發事件。隨着事件的發展而變得舒適。

這僅僅意味着在命令處理程序中只是構建事件並將它們推送到EventStore中。

在開始提交事件的項目中,您的應用程序中有更多的歷史記錄。

現在,繼續執行寫入命令處理程序中的規範化數據庫。

一旦你有幾個命令處理程序引發事件,下一步很容易。構建一個事件處理程序/ denormalizer,用於偵聽引發的事件,並簡單地執行與命令處理程序完全相同的寫入操作。

現在您所做的全部工作都是將WRITE責任移至denormalizer並遠離命令處理程序。

這基本上是我建議的過程,正如我所說,我已經做了兩次,它的工作原理。

將數據庫中的EXISTING數據遷移到事件的問題有點棘手。您必須將該數據視爲當前狀態,因此您可以構建和提交所有數據(使用您編寫的某個實用程序)爲系統中的所有數據創建事件。

例如,要遷移現有的帳戶表,您需要編寫AccountCreatedEvent並將其與表中每個帳戶中的所有數據一起提交。

+0

你處理的是哪種音量,需要多長時間? – Sinaesthetic

+0

你好,其中一個項目的數據庫是11gig。這是一個擁有超過100萬訂單的ecomm網站。 – boz

相關問題