私は nservice バスが初めてで、概念を学ぼうとしています。
顧客から支払いを受けた後に顧客を登録するアプリケーションを作成しようとしています。登録プロセスには、支払いやExternalXYZなどのサードパーティ統合がいくつかあります
私は以下の手順を行うことを考えています
- MVC コントローラーから WebAPI レイヤーを呼び出します。これにより、BeginRegistrationProcess などの NService バスを使用して顧客を登録するためのコマンドが送信されます。
- BeginRegistrationProcess は相関 ID を生成し、DB エントリを作成し、ProcessRegistration などの別のコマンドを使用して Saga を開始します。
ProcessRegistration は次のことを行います
- Db エントリを作成する
- 支払いサービスの呼び出し (DoPayment コマンドを使用 - これには、DB エントリの作成、呼び出しの作成、応答の処理などの手順が含まれます)
- ExternalXYZ Web サービスを呼び出します (DoPayment と同様の手順で CallExternalXYZ コマンドを使用)。
これら 2 つのサービス呼び出しに対して 2 つの別個のコマンドを作成して、それらが独自の小さなトランザクション スコープ内に収まるようにすることを考えています。これらのコマンドは、サービス呼び出しの前後に詳細を記録します。(これは、サービス呼び出しが失敗し、再試行する必要がある場合の補償ロジックに役立つ場合があります)
ここに私の質問があります
- これは良いアプローチに聞こえますか?
- エラーシナリオをどのように処理しますか。たとえば、ステップ 3 の DB エントリが完了し、支払い中にタイムアウトが発生したとします (カードが引き落とされ、返信の投稿中にタイムアウトが発生したか、ネットワーク タイムアウトである可能性があります)。カードが二重に引き落とされないようにするにはどうすればよいですか。
- DoPayment ハンドラでエラーが発生した場合、nservicebus は ProcessRegistration サガ内のトランザクションをロールバックします
- エラーが発生した場合、サービスを呼び出す前に DoPayment から行う DB 呼び出しはどうなりますか。
サガで補償を処理する方法を示すサンプルはありますか? ProcessRegistration によって開始できる補正サガを作成したいと考えています。ログ テーブル (このテーブルには前後の各サービス コールの記録があります) を使用して補正を開始できますか?