13

ほとんどの場合、CQRS + ES システムにおけるコマンドとイベントの違いを理解しています。しかし、私には理解できない状況が 1 つあります。

ユーザーが借方/貸方を入力できる個人の財務追跡システムを構築しているとします。これらは明らかにコマンドであり、検証されるとドメイン モデルが更新され、イベントが発行されます。ただし、クレジット/デビット情報も外部システムから直接取得されるとします。たとえば、ユーザーの花屋が、定期的な母の日の配達に対してユーザーのクレジットカードに請求したというメッセージを送信します。この場合、メッセージはイベントのように見えますが (料金は既に発生しています)、メッセージの形式が正しくなく、拒否される可能性があります。それで、それは本当にコマンドですか?ただし、ACK/NACK を送信する方法が必要ですが、ここではそうではありません (花屋は、引き落としが行われたことを知って初めてメッセージを送信します)。

編集: 明確にするために、私は外部システムが私のイベントやコマンドについて何も知らないという話ではありません。外部システムからデータを受信し、イベントを発行するか、コマンドを送信する必要があるコンポーネントがあります。問題は、コンポーネントがイベントまたはコマンドのどちらを使用する必要があるかということです。

4

2 に答える 2

15

これは境界付けられたコンテキストの完璧な例です。

同じまたはビジネス プロセス ステップを表す別のシステム (または境界付けられたコンテキスト) で発生したイベントは、受信側システムで発生したイベントとして扱われるべきではありません。

花屋システムの借方イベントは、財務追跡システムで発生した借方イベントとは異なる構造を持つ場合があります。

これを解決するには、フローリスト システムのイベントをリッスンするエンドポイントを用意し、そこからイベントの情報に基づいて財務追跡システムにコマンドを発行させ、必要に応じて財務追跡システムの情報と組み合わせることができます。これが発生する場所は、Finance Tracking System のクライアント、または「ドメイン サービス」と考えることができます。

この特定のケースでは、フローリスト システムからのイベントに、フローリスト システムで発生したトランザクションの情報が含まれています (境界付けられたコンテキスト)。ドメイン サービスで決定を下すことはありませんが、Finance Tracking System ドメインにコマンドを発行し、そこで決定が行われ、Finance Tracking System イベントが発行される可能性があります。花屋システム イベントが財務追跡システムで不正な形式で表示された場合、要求/応答または Ack/Nack の方法で花屋システムにそのことを伝えたくないでしょう。イベントは花屋から発行されたものであり、そのようなものを実装すると、メッセージング パターンが壊れてしまいます。メッセージング インフラストラクチャでは、メッセージを再試行したり、受信コードを修正して新しいコードでメッセージを再試行したりできる必要があります。

ただし、Florist の境界コンテキストと通信する必要がある場合は、Florist システムで Finance Tracking System からのイベントをサブスクライブして、トランザクションが正常に処理されたかどうかを調べることができます。これは、トランザクションが発生するかどうかをメイン システムが判断する場合にのみ必要です。

Finance Tracking System はトランザクション ログのようなものであり、Florist イベントを Finance Tracking System イベントとして扱わないことだけを説明している場合。Finance Tracking System イベントを発生させるコマンドを発行する間に何かを挿入します。

編集:

あなたの編集への応答として。受信コンポーネントは、Finance Tracking System ドメインにコマンドを送信する必要があります。これにより、(通常どおり) イベントが発行されます。

于 2012-08-10T07:55:40.910 に答える