2017-05-24 4 views
-1

マイクロサービスでは、複数のマイクロサービスが影響を受けたときに、すべてのサービスが更新されるようにするにはどうすればよいですか?

オンラインチェックアウト:

ユーザーは、ショッピングカートに商品を追加し、チェックアウトをクリックし、クレジットカードでの順序のために支払います。

  1. 注文はOrderMicroserviceを介して作成され
  2. 注文はお支払いは、クレジットカードを介して処理し、PaymentMicroservice

    c)の請求書を経由して記録されOrderMicroservice

    B)を経由して「完了」の状態に更新されA)

  3. InvoiceMicroserviceを介してユーザに電子メールで送信されます。

請求書マイクロサービスが失敗したか、データベースストレージがいっぱいか、電子メールの送信に失敗したか、支払いが失敗しましたが、注文が既に「完了」とマークされている場合、データベースをロールバックする必要がありますか?ワークフロー全体が正しく実行されたことを確認するためにここで何をしますか?

答えて

1

ご注文のステータスフローを変更する必要があるようです。 Invoiceマイクロサービスが失敗するだけでなく、どのステップも(支払いは一例として却下される可能性があります)参照してください。代わりに、次の流れ:

create order --> mark as completed --> do payment --> create invoice 

その結果、この

create order --> mark as "waiting for payment" --> do payment --> 
--> mark as "ready for invoice" --> create invoice --> mark as completed 

のようなものを考え、あなたは異なるステータスで注文を持つことになりますし、フェイルの場合で異なるそれらを処理することができるようになります。


さらに、失敗した場合は後で各ステップを再試行できるかどうかを検討する必要があります。大まかな例として、スケジュールされた仕事があり、ステータスが「請求書の準備ができました」のすべての注文の請求書​​メールが生成されます。したがって、注文が失敗した場合は、次のラウンドで再度メールを生成しようとします。

+0

これはESBとSagaが何かを起こすようなものです。理想的には、OrderItemコマンドはOrdering Sagaを起動し、他のサービスからのイベントを待ってから、他のすべての依存サービスが完了したらOrder Statusを更新します。 – Fran

関連する問題