2017-05-01 2 views
1

私は複数のhttp要求が行われるアクションを持つAzureアプリケーション(AzureApi1)を持っています。操作は、複数のテーブルにデータをAzure SQL DBに挿入します。Azure分散トランザクションでは、1つのhttp呼び出しが失敗した場合にフル操作をロールバックする最良の方法は何ですか?

次に、同じコード内から外部API呼び出し(ExApi)を行います。外部呼び出しの結果を使用して、他のテーブルを挿入/更新します。これはAzureにはありません。

次に、最初のリソースグループと同じリソースグループにある別のapi(AzureApi2)を呼び出し、同じリソースグループ内にある別のAzure Sql Dbにデータを挿入します。

私は、AzureApi1とAzureApi2の両方でTransactionScopeを使用していますが、これらは個別に問題なく動作します。しかし、その間に1つの外部APIがあり、私の制御下にないので、そのAPI呼び出しに何らかの障害が発生した場合は、完全な操作をロールバックする必要があります。しかし、現在、最初のAPIは、2回目のapi呼び出しが異なるhttp呼び出しであるため、正しくロールバックされています。最初のAPI呼び出しのトランザクションスコープには該当しません。 私は2番目のSql Dbからデータをロールバックする方法も必要です。

このような状況で手動でロールバックするのに最適な方法は何ですか。

答えて

1

複数のAzure SQL DB間の分散トランザクションの場合は、elastic database transactionsを使用できます。しかし、SQLデータベースとAzure SQLデータベースでは、エラスティックなデータベーストランザクションは拡張できません。この状況のた​​めに、独自の分散トランザクションコーディネータを作成する必要があります。

すべての操作のステータスを監視するコーディネーターとして機能する新しいWeb APIを作成することをお勧めします。手順は次のようになります。

  1. 操作が停止している場合は、コーディネーターにメッセージ(成功または失敗)を送信する必要があります。

  2. すべての操作が完了すると、コーディネーターはすべての操作にメッセージ(コミットまたはロールバック)を送信します。メッセージは、各操作から受信したすべてのメッセージに依存します。

  3. すべての操作が変更をコミットし、コミット結果(成功または失敗)をコーディネーターに送信します。

  4. コーディネーターは、各操作から受け取ったコミット結果に応じて、各操作に最終状態を送信します。

  5. これらの通信にタイムアウトを追加することができます。タイムアウトが発生した場合は、すべての操作をロールバックする必要があります。

+0

こんにちは@お返事ありがとうございます。このソリューションは素晴らしいですが、時間とリソースの面ではやや高価です。特に、1つのhttpリクエストの入力が他のhttpレスポンスの結果に依存するこのケースでは、この解決策が適用可能かどうかわかりません。 –

+0

このソリューションは、一般的な分散トランザクションで使用できます。分散トランザクションでは、状態を監視するコーディネータが必要です。分散トランザクションを使用するのは、アプリケーションの各ブランチの一貫性を確保するためです。 – Amor

関連する問題