A.1 付録: Sagaフレームワークのトラブルシューティング

この付録では、JavaアプリケーションでSagaフレームワークを使用するときに発生する可能性のある、様々な問題のトラブルシューティング方法について説明します。

Sagaフレームワークは、複数のプラガブル・データベース、バックグラウンド、フォアグラウンド・データベース・プロセスで構成される、複雑な分散システムです。Sagaフレームワークはイベント・メッシュとして、データベースのAdvanced Queueing (AQ)またはTransactional Event Queues (TxEventQ)を使用します。イベント・メッシュはSagaトポロジ内の様々なエンティティ間で、イベントをシームレスに分散します。AQメッセージ伝播と通知機能により、Sagaトポロジ内の複数のエンティティへのイベント転送が可能になります。次のコールリターン図は、サンプル・プログラムで説明されている単純なSagaアプリケーションの存続期間を示しています。

図-1 Sagaライフサイクルとコールリターンのフロー

Sagaライフサイクルとコール・リターンのフロー

ノート:

  • Sagaフレームワークは、メッセージ・ブローカを仲介として使用する、イニシエータと参加者の間でメッセージ伝播を使用します。また、AQ通知フレームワークを利用して、参加者とコーディネータが受信したメッセージに応答できるようにします。この図では、メッセージ・ブローカは描かれていません。

  • データベース・コミット(DBコミット)は、Sagaコミット(Sagaファイナライズ)とは異なります。つまり、データベース・コミットは、Sagaに対して実行される参加者またはイニシエータ・データベースでローカル・データベース・トランザクションをコミットします。一方、Sagaコミットは、Sagaのかわりに様々な参加者によって実行されるSagaと、そのすべてのトランザクションをコミットします。Sagaコミットは、グループとしてのSagaのすべてのローカルトランザクション変更の最終コミットです。これらのトランザクション変更は、各DBコミットを使用して、以前に様々なSaga参加者によってコミットされました。逆に、Sagaのロールバックは、補正を行うことで、グループとしてのSagaのローカルトランザクションの変更を取り消します。

  • Sagaフレームワークは、Saga開発用の非同期プラットフォームを提供します。非同期プラットフォームはデータベース内のAQメッセージングによってサポートされます。ただし、特定の操作はデータベース・サーバー内で同期され、実行されます。たとえば、Sagaの初期化は同期操作です。同期操作のもう1つの例に、コーディネータとイニシエータでのSagaファイナライズがあります。

  • 現在のバージョンのSagaインフラストラクチャでは、イニシエータとコーディネータがPDB内に共存します。共存するイニシエータとコーディネータを使用すると、両方のエンティティを含む単一のデータベース・トランザクションを使用してSagaをファイナライズできます。この側面を強調している、図の「トランザクション境界」を参照してください。