1

面倒な質問で申し訳ありませんが、ユースケースを紹介して詳しく説明します(これは私の実際のケースではないため、イベント/サービスの名前や責任に注意しないでください)。

「ストア」と「エコノミー」というサービスを備えたシステムを考えてみましょう。ストアサービスはアイテムの購入を処理し、「CustomerBoughtItem」、「CustomerReturnedItem」、「StoreIsClosed」の3つのイベントを公開します。現在、エコノミーサービスはこれらのイベントをピックアップし、毎日財務レポートを作成します。レポートは、ショップが閉店した直後に作成する必要があります。ストアサービスからのすべてのイベントを日次レポートに含めることが重要です。つまり、エコノミーサービスは、ストアからのすべてのイベントが処理される前に財務レポートを作成できません。「StoreIsClosed」イベントの処理を開始する前に、すべての「CustomerBoughtItem」イベントと「CustomerReturnedItem」イベントがエンドポイントで処理されたことを決定論的に確認するにはどうすればよいですか?

4

1 に答える 1

1

次のパターンを使用できます。

佐賀を開いて、これらの3つのメッセージを受け取ります。すべてのメッセージにはシーケンシャルIDがあります(たとえば、intなど)。すべてのシーケンシャルIDを保存し、受信したこれらのメッセージすべてについて次のことを確認します。

  • StoreIsClosedメッセージが特定の時点で受信されました
  • すべてのID(0または1からStoreIsClosed-SequentialIdのIDまで)はシーケンシャルであり、IDが欠落していません

これらの2つの条件が満たされている場合は、.SendLocal(CreateDailyReportMessage)を介して最後のメッセージをサガに送信します。

より良いフォーマットのために編集し、コメントに答えるために:

別のサービスによって公開された「StoreIsClosed」イベントとは、他のサービスは現在、最後のSequentialIdが何であるか、またはより一般的にはイベントを担当するサービスであり、StoreIsClosedは顧客のトランザクションについて何も知らないと仮定します。

したがって、ストアサービスは、エコノミーサービスがより多くのコンテキスト情報を暗黙的または明示的に送信する必要があります。

例:

  • (暗黙的)ストアサービスでStoreIsClosedイベントをサブスクライブし、サガでサブスクライブされているCustomersHaveBoughtOrReturnedTodayメッセージを公開します。ここには、サガでクロスチェックできるトランザクションIDのリスト、またはトランザクションの総数やそのストアの最初のシーケンシャルIDと最後のシーケンシャルIDなどの他の種類のチェックサムを含めることができます。
  • (明示的)セージが完了する準備ができる直前に、すべてのトランザクションを処理したかどうかをストアサービスに明示的に尋ねます。(あなたの佐賀で送信/返信)
于 2012-08-29T10:00:25.603 に答える