4

CQRS アーキテクチャで次の問題をどのように解決しますか。

  1. Order というドメイン エンティティがあります。
  2. 注文を処理する必要があります。
  3. 新しく作成された注文は未処理で、処理キューにあります
  4. 各注文を複数回処理してはなりません。
  5. 未処理の注文を照会する (物事の側面を読み取る) 複数の Windows サービスがあります。

では、各注文が 1 つのサービスだけで処理されるようにするにはどうすればよいでしょうか?

サービスが Command を発行するようにしますStartOrderProcessing(order)。バージョンが異なるため、別のサービスがこの注文の処理をすでに開始している場合、このコマンドはドメインで失敗します。
ただし、Command は本質的に非同期であるため、サービスはどのようにして障害を認識するのでしょうか?

サービスは読み取りモデルをポーリングして、注文のステータスが処理中に変わったかどうかを確認する必要がありますか? しかし、別のサービスのコマンドではなく、独自のコマンドのためにステータスを変更したサービスはどうなるでしょうか?


UL:

  • 注文: 私のシステムの注文は、メールボックスのグリーティングを更新するユーザー要求を表します。
  • メールボックス: 携帯電話に電話をかけたときに電話に出なかった場合、メッセージを残すためにメールボックスにリダイレクトされます
  • あいさつ: メールボックスに到着すると、ビープ音が鳴った後にメッセージを残すようにというメッセージが表示されます。このテキスト (あなたのメッセージではありません!) がグリーティングです。
  • 有効化: メールボックスに新しいグリーティングを設定するプロセスは、有効化と呼ばれます。グリーティングがアクティブ化されています。
  • キャリア: 携帯電話サービスを提供する会社 (T-Mobile など)。

注文を処理する際の手順:

  1. 事前に録音されたサウンド ビットからグリーティングを作成します。これは、メールボックスが関連付けられているキャリアによって異なります。
  2. キャリア固有のワークフローを実行して、メールボックスでグリーティングを有効にします。このワークフローには次の要素があります。

    2.1. メールボックス
    2.2 を呼び出します。DTMF トーンを使用してメールボックス メニューをナビゲートする
    2.3. メールボックスが送信する特定の音声要素 (確認のビープ音など) の認識
    2.4. 1で作成したグリーティングを再生する

    ワークフローはキャリアごとに異なるため、Windows Workflow Foundation ワークフローとして定義されます。

  3. 成功時:

    3.1. アクティベーション コールの記録を保存する
    3.2. 成功をメールでユーザーに通知

  4. エラー時:

    4.1. 失敗したアクティベーション コールと失敗の理由の記録を保存する
    4.2. これが最初の試行であった場合は、X 分後に再試行するように注文をスケジュールし
    ます。 4.3. これが 2 回目の試行であった場合は、失敗についてメールでユーザーに通知します

4

2 に答える 2

2

最初に、1 つのサービス インスタンスのみがオーダーをデキューして処理できるように、デキューを整理する必要があります。これをチェックしてください:http://www.eaipatterns.com/CompetingConsumers.html

たとえば、NServiceBus はそのまま使用できます。

次に、おそらく注文処理について考えたいと思うでしょう。StartOrderProcessingは、私にとってビジネスのステップとは思えません。注文を処理するための実際の手順は何ですか?

注文の処理は、実際には有限状態マシンである場合があります。エントリ ポイントと 1 つ以上の終了条件があります。

サガの概念を見てみましょう。集合体がステート マシンを経由して情報を収集し、それをドメインまたは他の境界付けられたコンテキストに送信して、サガを前進させる決定を下せるようにすることができます。

これを見てください: https://github.com/haf/Documently/wiki/Sagas-SnowPloughExample

于 2012-08-21T14:41:51.930 に答える
1

だけでなく と の間にOrder違いがあるように聞こえます。おそらく、これらはドメインを反映するために個別にモデル化する必要があります。これにより、ドメイン モデルが改良されるだけでなく、問題そのものを簡素化するのにも役立ちます。UnprocessedOrderProcessedOrder

于 2012-08-21T19:05:15.090 に答える