我已經閱讀Jonathan Oliver關於處理亂序事件的好消息。在CQRS讀取端處理亂序事件
http://blog.jonathanoliver.com/cqrs-out-of-sequence-messages-and-read-models/
,我們用的是出隊的消息,並把它放在一個「支持臺」,直到與前一個序列的所有消息都收到 的解決方案。當收到所有先前的消息時,我們將所有的 消息從保留表中取出,並依次通過 合適的處理程序運行。一旦所有處理程序都成功執行 ,我們將從保留表中刪除消息,並提交 更新到讀取模型。
這適用於我們,因爲該域名發佈事件並使用適當的序列號標記它們 。沒有這個,下面的解決方案 會更困難 - 如果不是不可能的話。
該解決方案使用關係數據庫作爲持久性存儲 機制,但我們沒有使用存儲引擎的任何關係方面。與此同時,所有這一切都有一個警告。 如果消息2,3和4到達但消息1從未做過,我們不會將它們中的任何一個應用於 。只有在處理消息1時出現錯誤 或者消息1以某種方式丟失時纔會發生該情況。幸運的是, 很容易糾正我們的消息處理程序中的任何錯誤,並且 重新運行消息。或者,在丟失消息的情況下,直接從事件存儲器重新構建 。
有幾個問題,特別是他如何說我們總是可以向活動商店索要失蹤事件。
- CQRS的寫入端是否必須公開讀取 端的服務以「請求」重放事件?例如,如果事件1不是收到的 ,而是2,3,4,我們是否可以通過 服務請求事件庫重新發布從1開始的事件?
- 這個服務是CQRS寫端的責任嗎?
- 我們如何使用它重新構建讀取模型?
我們使用RabbitMq的「重試」方法,它工作正常。如果經過多次重試仍然無效 - 只需將該事件置於死信隊列中並重置序列號,以便可以正確處理更多事件。通常在您的應用程序中亂序事件的原因是什麼? – IlliakaillI
我有一些會生成多個事件的特定命令。我還沒有執行任何操作,但可能會出現亂序事件。我的活動發佈者也是異步工作的。所以有可能某些事件可能無法按順序發佈。我依靠我的事件序列號來幫助我重新組合。 我會嘗試重試方法。如果你可以詳細說明一下,我可以將其標記爲答案。 –
我在答案的評論部分添加了更詳細的解釋。 – IlliakaillI