2015-12-02 24 views
4

我玩弄了一點,並偶然發現多線程環境中的問題,即總線中的消息順序可能無法得到保證,或者事件的處理可能不會在下一次到達之前完成。如何確保CQRS模式下的消息順序

因此,ItemCreated消息可能發生在ItemChangedSomething消息之後,或者至少第一條消息沒有完全處理。這會導致「讀取方」中的問題,因爲我想更新尚未提供的數據。

如何解決這個問題? (假設CQRS適合域設計案例。)

我是否必須創建一個傳奇或者是否有其他方法來做到這一點?

+3

我認爲讀取的模型預測通常是單線程的。因此,爭用問題不存在。 – plalx

+0

@plalx你能說說單線程嗎? – Hippoom

+1

我同意@plaix:你可以有* n *個預測,但是每個都必須是單線程的,因爲事件按時間順序發生,因此按固定順序發生。多線程在這種情況下沒有意義,因爲與特定相關ID相關的事件不會並行發生。 –

回答

3

您應該選擇一種消息傳遞基礎結構,即使多個線程並行傳遞給不同的使用者,也可以保證以消費者爲單位按順序傳遞事件。即,如果您在發送方按順序提供事件,則消費者將按順序接收它們。

然後有處理這種情況的兩種基本方法:

  • 基礎設施:在沒有分佈式數據存儲小CQRS應用程序,可以記錄每個事件的全局和增加的唯一ID。然後確保事件由消息體系結構按其ID的順序傳遞。這將完全消除亂序事件傳遞。同樣,您可以記錄事件的時間戳並按時間戳順序傳送。雖然這可能會導致某些情況下的競爭條件,但對於大多數應用程序和用例,基於時間戳的排序已足夠(特別是,如果ItemCreatedItemChanged基於人爲操作)。

  • 狀態機:對於較大(通常分佈)的設置,你可以使用顯式或隱式自動/狀態機模型,以應付的消息的亂序到來。使用適當的消息傳遞基礎架構,如果源自同一個流,則永遠不會收到ItemCreatedItemChanged亂序,但可能發生來自兩個不同源(流/聚合根)的事件被任意投影或傳奇消耗訂購。由於這些事件是獨立的,所以通常有一種方式(思考狀態機)使投影保持有效狀態。

+0

是「國家機器」在這裏像一個佐賀? – Beachwalker

+0

我的意思是狀態機和基本的計算機科學定義一樣,因爲你可以在概念和閱讀方面都使用這個概念。 –

相關問題