2016-11-22 47 views
2

我一直在閱讀關於事件採購模式,如果您想重建您的系統,這可能非常有用。但是,如果我需要在處理新的傳入請求時運行事件重建,該怎麼辦?這種情況下是否有特定的模式或最佳做法? 因此,如何確保新的傳入請求不會在重播時堵塞我的系統,因爲事件同步和順序對我的系統非常重要。它涉及更新依賴於事件序列的數據庫記錄。有什麼想法嗎?事件採購 - 事件回放

+0

這似乎是一個非常類似的問題我的http://stackoverflow.com/questions/38197712/event-sourcing-avoid-projects-duplicated-events-while-replaying-events-and-list – martinezdelariva

回答

0

由於您描述的限制,聽起來好像從零重建不能成爲您計劃的一部分。您可以改爲進行A/B設置,在當時處於脫機狀態的新系統上播放事件,然後在新系統啓動後切換到新系統。關鍵是舊系統和新系統可以同時調諧到事件流。

如果您訂購了不同系統的事件子集,可能只需要爲其中一個子系統重播事件,並且在沒有該子系統的情況下仍然可以滿足您的同步/順序需求。

您可以通過在數據中包含事件序列號並且如果還沒有看到該事件,並具有依賴序列的服務延遲處理,可以防止作用於過時的信息。

+0

謝謝,這意味着爲了確保新系統完成所有追趕工作,我需要安排一個小的停機時間並關閉舊系統,以確保沒有更多新數據流入舊系統。 然後,一旦確認新系統已完全追上,我將需要打開新系統。 無論如何,我似乎都需要爲我的服務安排一些停機時間,以確保數據的準確性。 糾正我,如果我錯了。 – Nyamnyam

+0

我認爲你是誤會。事件日誌是事件採購的真相源泉,而所有其他系統都只是事件消費者。停機時間不是必需的;這只是一個確保您對這種轉換過程中如何處理事件感到滿意的問題。 – rep

0

爲了將您的事件投影到讀取模型中,您需要使用某種類型的追趕訂閱,例如EventStore提供的訂閱。在這種情況下,您的新活動將被保存到商店,但不會立即投影。

但是,您必須認識到,您的用戶將開始查看大量過時的數據,並根據不一致的讀取模型進行操作。我寧願避免這種情況,讓系統重建。

我同意第一個答案,您可能希望與更新舊版本並行並在某個時間點進行切換並行建立新的讀取模型,可能並非所有用戶都優先。

+0

如果可能,我們不希望將第三方庫用於事件重播。 – Nyamnyam

+0

EventStore不是圖書館http://www.geteventstore.com –

0

我在類似的情況下使用了CQRS + ES。 我使用準備好的數據創建了投影,我只能更新,但不能重建。 而且在每一個查詢中,我都從這個快速構建了結果信息。

如果您需要執行一些較長的操作(如db中的更新),請使用sagas。在事件結束後生成事件 - >傳奇 - >更新投影並生成事件2。

當然,事件收入和投影更新之間會有一些延遲。

瞭解更多關於您的系統以及這種變體是否足夠適合您是非常有趣的。