私はCQRSとイベントソーシングの概念を学ぶために、小さなサンプルアプリケーションに取り組んでいます。私が持っているBasket
骨材とProduct
独立して動作するはず集計を。
実装を示すための擬似コードを次に示します
Basket { BasketId; OrderLines; Address; }
// basket events
BasketCreated { BasketId; }
ItemAdded { BasketId; ProductId; Quantity }
AddItemSucceeded { BasketId; ProductId; Quantity }
AddItemRevoked { BasketId; ProductId; Quantity }
ItemRemoved { BasketId; ProductId; Quantity }
CheckedOut { BasketId; Address }
Product { ProductId; Name; Price; }
// product events
ProductReserved { ProductId; Quantity }
ProductReservationFailed { ProductId; Quantity }
ProductReservationCancelled { ProductId; Quantity; }
コマンドはイベントによく似ており、過去形ではなく命令名を使用します。
現在、これらは独立してうまく機能します。コマンドを発行し、集約のイベントをAddItem
作成します。このItemAdded
イベントBasket
は、「バスケット」の状態に対して必要な処理を行います。同様に、製品の場合、コマンドとイベントは正常に機能します。
私はこれを次のようなプロセスに結合したいと思います(発生するコマンドとイベントに関して):
プロセスマネージャは次のことを行います。
on BasketCreated: CreateShoppingProcess
on ItemAdded: ReserveProduct
on ProductReserved: SucceedAddingItem // does nothing, but needs to be there so that the basket knows it can check out
on ProductReservationFailed: RevokeAddItem
on RemoveItem: CancelProductReservation
on Checkout: CreateOrder // create an order and so on...
決定的な答えを見つけることができなかった質問は次のとおりです。
- プロセスマネージャーを永続化する必要がありますか?私のように思えますが、よくわかりません
- その場合、プロセスマネージャーのイベントを保存する必要があります。ただし、リッスンしているイベントは集約に関連付けられています。それらにプロセスIDを追加しますか?プロセスマネージャー専用の個別のイベントはありますか?これを行い、できるだけ乾燥した状態に保つ方法
ProductReserved
イベントのバスケットを知るにはどうすればよいですか?BasketId
それらについても大丈夫ですか、それとも情報が漏れていますか?- イベント間の関係を維持する方法、どのイベントがどのイベントを
ItemAdded
生成したかをどのようにして知ることができProductReserved
ますか?に沿って渡しEventId
ますか?これは奇妙に思えます... Basket
単純な集計ではなく、プロセスマネージャとして実装する必要がありますか?
さらに調査を重ねた結果、「佐賀」は独自のイベントを保持し、外部からのイベントをリッスンするものです。基本的に、それは集合体であり、自身の小さな世界の外で発生するイベントにも反応することができます。
Process Managerは、外部からのイベントを処理し、コマンドを送信します。correlationIdのような共通の識別子を共有するAggregatesで発生したイベントから履歴を再構築できます。