簡體   English   中英

如何確保CQRS模式中的消息順序

[英]How to ensure the order of messages in CQRS pattern

我和Greg Young的示例應用程序有點混淆,並且在多線程環境中偶然發現問題,即總線中的消息順序可能無法保證,或者事件的處理可能在下一次到達之前未完成。

因此,ItemCreated消息可能發生在ItemChangedSomething消息之后,或者至少第一條消息未完全處理。 這導致“讀取側”出現問題,因為我想更新尚未(尚)可用的數據。

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

我是否必須創建一個Saga或者還有其他方法嗎?

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

然后有兩種基本方法來處理這種情況:

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

  • 狀態機 :對於較大(通常是分布式)的設置,您可以使用顯式或隱式自動機/狀態機模型來應對消息的無序到達。 使用適當的消息傳遞基礎結構,如果它們來自同一個流,您將永遠不會ItemCreated接收ItemCreatedItemChanged ,但是可能會發生來自兩個不同源(流/聚合根)的事件被某些投影或傳奇任意使用訂購。 由於這些事件是獨立的,因此通常有一種方法(想想狀態機)將投影保持在任一訂單的有效狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM