2

DDD初心者です。今、私はドメインイベントを見ていました。このドメイン イベントを正しく理解しているかどうかわかりませんが、ドメイン イベントの公開に失敗したらどうなるか考えているだけです。

ここにケースがあります。バイヤーが私のウェブサイトから何かを注文するとき、最初にオブジェクト Order with item of items を作成します。ドメイン イベント OrderWasMade が発行され、Inventory の在庫が差し引かれます。ここでは、イベントが処理されたときにアイテムの数量が差し引かれ、システムが在庫を差し引こうとしたときに、アイテムの在庫が残っていないことが判明した場合 (金額 = 0) はどうなるでしょうか。 . したがって、アイテムの金額を差し引くことはできませんが、注文はすでにコミットされています。

こういうシチュエーションになるの?

ここで他の 2 つの質問を絞り込んで申し訳ありません。

  1. 各イベントは独自のトランザクション スコープにあるようです。これは、システムがデータベースへの複数の接続を一度に開く必要があることを意味します。IIS サーバーを使用している場合、DTC を有効にする必要がありますが、これでよろしいですか?

  2. ドメインイベントとドメインサービスの間に関係はありますか?

4

3 に答える 3

2

ドメイン イベントの公開に失敗した場合はどうなりますか?

MikeSW はすでにこれについて説明しました。イベントを発行する (つまり、履歴の一部にする) ことは、イベントを消費することとは別の問題です。

システムが在庫を差し引こうとしたときに、アイテムの在庫が残っていないことが判明した場合 (金額 = 0)。したがって、アイテムの金額を差し引くことはできませんが、注文はすでにコミットされています。

こういうシチュエーションになるの?

したがって、DDD の答えは次のとおりです。ドメインの専門家に尋ねてください。

ドメインの専門家と一緒に座ってユビキタス言語を調べてみると、これは注文のハッピー パスに対する十分に理解された例外であり、理解された軽減策があることに気付くでしょう (「注文のステータスを保留中としてマークし、そして、サプライヤーに追加の在庫をすでに注文しているかどうかを確認します...」)。これは基本的に要件発見の演習です。

そして、これらの要件を理解したら、実行に移します。

それは通常、「サガ」を意味します(やや誤解を招き、過剰な用語の使用)。何が起こっているかを追跡するビジネス プロセス/ワークフロー/ステート マシンの実装。

例を使用すると、 OrderWasMade は OrderFulfillment プロセスをトリガーし、注文の「状態」を追跡します。たとえば、OrderFulfillment がサプライヤからの次の配送まで待機する「AwaitingInventory」状態が存在する場合があります。

推奨読書:

于 2016-03-05T19:12:16.010 に答える
1

在庫を常にすぐに一貫させる必要がある場合、イベント ソース システムでこれを処理する一般的な方法 (非イベント ベースのシステムでも可能です。これは実際には直交しています) は、イベント ストア レベルでの楽観的ロックに依存することです。

イベントには基本的に、イベントのストリームが有効になると予想されるリビジョン番号があります。イベントが永続ストアに到達すると、そのリビジョン番号が実際のストリーム番号と照合され、一致しない場合は競合例外が発生し、トランザクションは中止されます。

@MikeSW が指摘したように、ビジネス要件によっては、在庫チェックは、結果的に一貫した方法で問題を処理するアウトオブバンド プロセスになる可能性があります。最終的には、プロセスの別の部分がすぐに引き継がれる場合は数ミリ秒から、人間のアクションが必要な電子メールが送信された場合は数時間に及ぶ可能性があります.

つまり、ドメインで必要な場合は、この一連のイベントを取引することを選択できます。

(OrderAbortedOutOfStock)

為に

(OrderMade, <-- Some amount of time --> OrderAbortedOutOfStock)

最終的には同じ集計状態になります

于 2016-03-07T14:27:37.387 に答える