1 MicroTxについて

Transaction Manager for Microservices (MicroTx)を使用すると、エンタープライズ・ユーザーは、ミッションクリティカルなアプリケーションでマイクロサービス・アーキテクチャを採用し、多用できるようになります。提供される機能によって、そうしたアプリケーションの開発とデプロイおよびアプリケーションでのデータ一貫性のメンテナンスが容易になるためです。

マイクロサービス・アーキテクチャには多くの利点がありますが、複数のサービスにまたがるリクエストでデータの一貫性を確保することは困難です。現在、サービス開発者は、アプリケーション・コードに補正トランザクションを含めるか、Sagaを使用して最終的な一貫性を実現することができます。ただし、これらのソリューションではエラーが発生しやすく、高度なコーディング・スキルが必要です。多言語マイクロサービスにまたがるトランザクションのトラブルシューティングや管理も困難です。各マイクロサービスが個々のデータベースを使用してデータを管理する場合はさらに複雑になります。

組織がマイクロサービス・アーキテクチャの採用を急速に進めるにつれ、データの一貫性に関する問題によく直面するようになります。通常、マイクロサービスごとに独自のデータベースがあるためです。モノリシック・アプリケーションでは、データベースとの一貫性を保つ必要がある他のデータ・ソースはないため、ローカル・トランザクションで十分でした。アプリケーションは、ローカル・トランザクションを開始し、いくつかの更新を実行した後で、ローカル・トランザクションをコミットします。こうすることで、アプリケーションが一貫性のある1つの状態から別の状態に移行することが保証されます。アプリケーションの状態が複数のデータ・ソースにまたがるようになると、いくつかの要因を考慮する必要があります。あるマイクロサービスで更新が成功したが、同じリクエストに含まれる別のマイクロサービスで失敗した場合はどうなるでしょうか。1つの解決策は、1つのリクエストに関わる複数のマイクロサービスで使用されるデータ・ソースにまたがる分散トランザクションを使用することです。Oracle Transaction Manager for Microservicesは、トランザクションに含まれるマイクロサービスの状態の一貫性を管理するためにトランザクション調整マイクロサービスおよびライブラリを提供します。

MicroTxは、Kubernetesクラスタにデプロイされた分散マイクロサービス・アプリケーション間でトランザクションの一貫性を保証します。次のアクションを実行します。

  • トランザクションを管理し、多言語マイクロサービス間で一貫性を実現します。
  • いくつかの分散トランザクション・プロトコルをサポートします。XA、Eclipse MicroProfile Long Running Actions (LRA)、Try-Confirm/Cancel (TCC)などです。業務要件と必要な一貫性のレベルに基づいて、アプリケーションに適したトランザクション・プロトコルを選択できます。
  • 可用性が高くスケーラブルかつ安全なソリューションを提供するというエンタープライズ顧客にとって切実なニーズに対応します。
  • Jaeger、Kiali、Prometheus、Grafanaなど、強力な最先端テクノロジと統合されています。データ・ビジュアライゼーション、データ・モニタリング、トランザクション・トレースなどの様々なアクティビティ・オプションを提供して、高度かつ効率的なトラブルシューティングおよびデータ管理操作が可能になります。
  • Kubernetesクラスタで実行し、オンプレミス、クラウドおよびハイブリッド環境で実行されるマイクロサービス・アプリケーションと連携します。
  • 一般的なプログラミング言語およびアプリケーション・フレームワーク(Node.jsやJavaなど)と連携します。
  • C、C++およびCOBOL言語で記述されたOracle Tuxedoサービスの組込みをサポートします。
  • PL/SQLで記述されたOracle Database常駐サービスの、他のマイクロサービスを含むグローバルXAトランザクションへの組込みをサポートします。

1.1 MicroTxの仕組み

MicroTxを使用するには、MicroTxをインストールしてから、MicroTxクライアント・ライブラリをアプリケーション・コードと統合してトランザクションを管理します。

MicroTxクライアント・ライブラリによって提供されるインターセプタについて

MicroTxクライアント・ライブラリによって提供されるインターセプタは、受信と送信両方のRESTコールと、それらのリクエストおよびレスポンスをインターセプトします。これらのインターセプタは、ヘッダーを使用してトランザクション・コンテキストを伝播します。これによって、参加側マイクロサービスがトランザクションに自動的に登録されます。また、インターセプタによって、適切なトランザクション・ヘッダーがすべての送信RESTコールで確実に伝播されます。

次の図に、リクエストとレスポンスの一般的なフローと、MicroTxライブラリによって提供されるインターセプタの役割を示しています。

MicroTxライブラリによって提供されるインターセプタの役割(トランザクション・コンテキストの伝播)

MicroTxクライアント・ライブラリを使用するマイクロサービスが、分散トランザクションを開始している場合、または分散トランザクションに現在参加している場合、ライブラリのインターセプタがアウトバウンドRESTリクエストにトランザクション・ヘッダーを追加します。マイクロサービスがリクエストを受信すると、受信側サービスのインターセプタがトランザクション・ヘッダーを識別し、自動的に参加側として分散トランザクションに登録されます。

MicroTxを使用する場合の一般的なトランザクション・ワークフローを次に示します。次の図は、MicroTxがアプリケーション・マイクロサービスと通信してトランザクションを処理する方法を示しています。

MicroTxを使用する場合の一般的なトランザクション・ワークフロー。
  1. アプリケーション開発者は、MicroTxライブラリに含まれる関数をアプリケーション・コードで使用します。
  2. マイクロサービスまたはクライアントがトランザクションを開始すると、MicroTxライブラリ内の関数を呼び出して分散トランザクションを開始します。
  3. MicroTxライブラリには、参加側サービスがトランザクションに自動的に登録できるようにするヘッダーが含まれています。
  4. イニシエータ・サービスの元のリクエストに関連付けられたすべてのタスクが完了すると、イニシエータ・サービスはトランザクション・コーディネータに要求して、すべての変更をコミットまたはロールバックします。
  5. トランザクション・コーディネータは、分散トランザクションの一部として参加側サービスが行った変更をコミットまたはロールバックするように、各参加側サービスにコールを送信します。

1.2 MicroTxのコンポーネント

MicroTxには、トランザクション・コーディネータとMicroTxライブラリの2つのコンポーネントが含まれます。

コンテナ化されたマイクロサービスであるMicroTxは、アプリケーション・マイクロサービスとともに実行されます。次の図は、MicroTxのコンポーネントがアプリケーション・マイクロサービスとどのように相互作用するかを示しています。

MicroTxのコンポーネント

トランザクション・コーディネータ・サーバー

トランザクション・コーディネータは、参加側サービス間のトランザクションを管理します。

MicroTxは、トランザクション状態の永続性を確保するために、内部メモリー、Oracle Databaseおよびetcdをデータ・ストアとしてサポートします。

MicroTxライブラリ

アプリケーション・マイクロサービスは、ビジネス・ロジックを提供し、トランザクションの境界を定めます。これらのサービスは分散トランザクションに参加します。MicroTx APIを使用して、分散トランザクションを管理します。

アプリケーション開発者は、次の要因に応じてMicroTxクライアント・ライブラリの各部を使い分けます:
  • マイクロサービスの開発フレームワーク(HelidonやNode.jsなど)。
  • 選択したトランザクション・プロトコル(XA、LRA、TCCなど)。
  • アプリケーションがトランザクションを開始するか、トランザクションに参加するか。
    • トランザクション・イニシエータ・サービス - このようなアプリケーションは、トランザクションを開始して終了します。前の図で、マイクロサービス1はトランザクション・イニシエータ・サービスであり、トランザクションを開始するリクエストをMicroTxに送信します。
    • トランザクション参加側サービス - このようなアプリケーションは、トランザクションに参加するだけです。トランザクションを開始することはありません。前の図では、マイクロサービス2およびマイクロサービス3が、トランザクションに含まれるトランザクション参加側サービスです。

1.3 分散トランザクション・プロトコルについて

MicroTxでは、次の分散トランザクション・プロトコルがサポートされています:

XAを使用するのは、ローカル・データベース・トランザクションによって提供される一貫性のように強力な一貫性が必要な場合です。これにはトランザクションのすべてのACIDプロパティが存在します。たとえば、財務アプリケーションです。LRAプロトコルを使用するのは、完了に時間がかかる可能性があるトランザクションの場合です。LRAプロトコルを使用すると、ロックの問題を軽減できます。TCCプロトコルは、飛行機座席やホテル客室などの予約モデルを使用するアプリケーションに適しています。LRAとTCCはどちらも長時間実行トランザクションをサポートしています。LRAの方が一般的ですが、成功したLRAの完了と失敗したLRAの補正のために、アプリケーション固有のアクションが必要です。一方、TCCでの補正は、予約を削除してから予約されていたものを使用可能リソースのプールに返すことによって実行されます。

1.3.1 XAトランザクション・プロトコル

XAを使用するアプリケーションは、トランザクションの境界を設定する必要があります。MicroTxがトランザクションをコミットまたはロールバックします。

XAプロトコルで、参加側マイクロサービスは、MicroTxクライアント・ライブラリを使用する必要があります。これが、コールバックを登録して、リソース・マネージャのためにコールバックの実装を提供します。次の図に示すように、MicroTxはリソース・マネージャと通信して、トランザクションをコミットまたはロールバックします。MicroTxは、トランザクションに関係する各リソース・マネージャに接続して、トランザクションを準備、コミットまたはロールバックします。参加側サービスは、リソース・マネージャにアクセスするための資格証明をコーディネータに提供します。次の図に示すように、MicroTxクライアント・ライブラリによってリソース・マネージャ・プロキシ(RMプロキシ)が提供されます。このプロキシにより、コーディネータがリソース・マネージャ固有のライブラリを保持する必要がなくなります。これはXAでは通常のケースです。トランザクション・コーディネータが、参加側のリソース・マネージャのために、トランザクションの準備、コミットまたはロールバックを行う必要がある場合は、マイクロサービスにコールバックを行います。さらに、プロキシが、そのマイクロサービスによって使用されているリソース・マネージャにリクエストをリレーします。このようなRESTベースのコールバックにより、トランザクション・コーディネータが、マイクロサービスで使用されるリソース・マネージャの影響を受けなくなります。

クライアント・ライブラリおよびRMプロキシの役割
  1. イニシエータが分散トランザクションを開始します
  2. コールされたマイクロサービスがトランザクションに登録されます
  3. イニシエータが、トランザクション・マネージャにトランザクションのコミットまたはロールバックを依頼します
  4. イニシエータがコミットを決定した場合、トランザクション・マネージャは各マイクロサービスに準備を依頼します
    1. すべての参加側の準備が正常に行われると、すべての参加側がコミットを依頼されます
    2. いずれかの参加側の準備が失敗すると、すべての参加側がロールバックを依頼されます
  5. イニシエータがロールバックを決定した場合、トランザクション・マネージャは各マイクロサービスにロールバックを依頼します
マイクロサービス、MicroTxクライアント・ライブラリ、およびコーディネータの間で通信がどのように行われるかを理解するには、「XAサンプル・アプリケーションについて」を参照してください。

1.3.2 LRAトランザクション・プロトコル

次の図は、Eclipse MicroProfile Long Running Actions (LRA)トランザクション・プロトコルを使用するときに、どのようにマイクロサービスが相互に通信したりMicroTxと通信したりするかを示しています。

LRAトランザクション・プロトコルを使用するマイクロサービス

マイクロサービスが相互に通信してサンプル・トランザクションを処理する方法を説明します。

  1. トランザクション・イニシエータ・サービスは、MicroTx LRAコーディネータをコールし、LRAトランザクションを開始してそれに登録するためのコールバックURIを渡します。
  2. トランザクション・イニシエータ・サービスは、ヘッダーでLRAのIDを渡して、1つ以上の参加側サービスを呼び出します。
  3. 他の参加側サービスはMicroTxをコールし、LRAトランザクションに登録または参加します。参加側がLRAに参加するとき、コールバックURIを提供しますが、これにはLRA内の担当部分を完了したり補正したりするものが含まれます。
  4. トランザクション・イニシエータ・サービスは、MicroTxをコールして、トランザクションを完了または補正します。
  5. MicroTxは、トランザクション・イニシエータ・サービスがトランザクションの完了と補正のどちらを要求するかに応じて、各参加側サービスの完了コールバックURIまたは補正コールバックURIをコールします。

各参加側は、相互に独立したローカル・トランザクションを使用します。LRAトランザクション・プロトコルはローカル・トランザクションを使用するため、システム全体では状態が矛盾する期間がありますが、トランザクションの目的はトランザクションの最後に一貫性を実現することです。これは、ローカル・トランザクションが個別に完了または補正されるためです。つまり、1つ以上のローカル・トランザクションが完了または補正されても、他のトランザクションが完了していない時期があります。ロックや分離が行われないため、他のシステムまたはユーザーがこのように一貫性のない状態を認識する場合があり、一貫性のない状態に基づいて誤った決定を行う可能性があります。

1.3.3 Try-Confirm/Cancelトランザクション・プロトコル

Try-Confirm/Cancel (TCC)トランザクション・プロトコルは、トランザクションが確定されるか取り消されるまで、リソースを予約状態のまま保持します。トランザクションが取り消されると、予約されたリソースが解放され、インベントリで使用できるようになります。

TCCトランザクション・プロトコルは、基本のHTTP動詞(POSTPUTおよびDELETE)に依存します。アプリケーションが次のガイドラインに準拠していることを確認します:

  • トランザクション・イニシエータ・サービスは、POST HTTPメソッドを使用して新しい予約を作成する必要があります。このリクエストへのレスポンスとして、トランザクション参加側サービスは予約を表すURIを返す必要があります。MicroTxクライアント・ライブラリは、MicroTx固有のヘッダーにそのURIを配置して、URIがコール・スタックに伝播されるようにします。
  • このプロトコルは参加側サービスに依存して、確実にすべての参加側サービスが予約を確定するか取り消すようにします。URIは、予約を確定するためにPUT HTTPメソッドに応答し、予約を取り消すにはDELETE HTTPメソッドに応答する必要があります。

次の図は、TCCトランザクションでマイクロサービスとMicroTxが相互に作用する仕組みを示しています。

1つのトランザクションでXおよびYを予約するために、様々なコンポーネントが相互に作用する仕組み。

マイクロサービスAはトランザクション・イニシエータ・サービスです。トランザクションを開始して終了させます。トランザクションに参加側サービスを含める必要があることを示すリクエストを参加側サービスに送信します。

マイクロサービスBおよびCは参加側サービスです。これらのサービスは、既存のトランザクションに参加するだけです。トランザクションを開始することはありません。

試行フェーズ

TCCプロトコルでは、トランザクション・イニシエータ・サービスが、他の参加側マイクロサービスにリソースを予約するように求めます。試行フェーズで、MicroTxライブラリは、受け入れたすべての予約を収集します。これには、参加側サービスによって行われた予約が含まれます。イニシエータ(上にある例の図のマイクロサービスA)がマイクロサービスBとマイクロサービスCに対して予約を完了するまで、MicroTxライブラリがすべての予約を収集します。その時点で、イニシエータは、予約の確定、取消または無視を決定できます(無視した場合、タイムアウトによって最終的に予約が取り消されます)。

確定/取消フェーズ

イニシエータ・サービスに指定されているビジネス・ロジックに基づいて、すべての予約を確定するか、すべての予約を取り消すかを決定できます。イニシエータとすべての参加側が必要な予約を取得すると、イニシエータ・サービスは、すべての予約を確定するようにMicroTxにリクエストを送信します。イニシエータ・サービスがビジネス・ロジックに基づいて、行われた予約が必要ない(使用できない)と判断すると、すべての予約を取り消すようにMicroTxにリクエストします。予約の内容はアプリケーションによって異なります。

公演の座席を予約して購入するためのシンプルなマイクロサービスについて考えてみましょう。座席の状態は、AVAILABLERESERVEDSOLDのいずれかになります。試行フェーズでは、座席の状態がAVAILABLEからRESERVEDに変更されます。確定フェーズでは、支払が正常に完了したことを前提として、状態がRESERVEDからSOLDに変更されます。取消フェーズでは、状態がRESERVEDからAVAILABLEに変更されます。支払が正常に完了しなかった場合の確定ステップのエラーを防ぐために、試行フェーズでは、マイクロサービスは支払が確実に行われるように支払承認を取得する必要があります。

アプリケーションが特定の数量(在庫の品目や口座の資金など)を予約する別の例について考えてみましょう。このケースでは、試行フェーズで、使用可能な数量から予約した数量を差し引き、予約のレコードがデータベースに追加されます。確定フェーズでは、予約レコードが削除されます。取消フェーズでは、予約レコードの数量が在庫数量に戻され、予約レコードが削除されます。

次のステップで、マイクロサービスとMicroTxを含むTCCトランザクションの正常なパスを示します。エラー時には、イニシエータ・サービスが確定のかわりに取消をコールします。

  1. トランザクション・イニシエータ・サービスであるマイクロサービスAが、MicroTxクライアント・ライブラリ・コールを行ってTCCトランザクションを開始します。
  2. トランザクション・イニシエータ・サービスは、参加側サービスであるマイクロサービスBでPOSTを呼び出して、リソースXを予約します。
  3. マイクロサービスBは、必要なリソースを予約し、その予約を表すURIをトランザクション・イニシエータであるマイクロサービスAに返します。
  4. トランザクション・イニシエータ・サービスは、参加側サービスであるマイクロサービスCでPOSTを呼び出して、リソースYを予約します。
  5. マイクロサービスCは、必要なリソースを予約し、その予約を表すURIをトランザクション・イニシエータであるマイクロサービスAに返します。
  6. マイクロサービスA (トランザクション・イニシエータ・サービス)が、MicroTxをコールして、予約を確定するか取り消します。
  7. MicroTxが、PUTをコールして確定するか、DELETEをコールしてすべてのURI (予約)を取り消し、トランザクションを完了します。
  8. 参加側サービスはリソースを確定するか取り消してから、HTTPレスポンス・コード200MicroTxに返します。
  9. MicroTxは、トランザクション・イニシエータであるマイクロサービスAに正常を示すステータスを返します。MicroTxが、1つ以上の参加側から200ステータスを受信しない場合は、エラー・メッセージを返します。

1.4 MicroTxをインストールして使用するワークフロー

MicroTxをインストール、構成、および使用してトランザクションを管理するためのガイドとして、次のワークフローを使用します。

タスク 説明 参照
要件を理解し、アプリケーションのためにトランザクション・プロトコルを選択します 業務要件に基づいてMicroTxのインストールと設定を計画します。 計画
インストール・バンドルをダウンロードします インストール・バンドルには、MicroTxイメージとその他の必要なファイルが含まれています。 インストール・バンドルのダウンロード
認証および認可の要件を満たします アイデンティティ・プロバイダを設定し、アクセス・トークンを作成します。 認証および認可について
MicroTxイメージをDockerレジストリにプッシュし、構成情報を指定してから、MicroTxをインストールします。 MicroTxは、KubernetesクラスタまたはDocker Swarmにインストールできます。Kubernetesの場合はvalues.yamlファイルに、Docker Swarmの場合はtcs-docker-swarm.yamlファイルに構成情報を指定します。 KubernetesクラスタへのインストールまたはDocker Swarmへのインストール
MicroTxへのアクセス MicroTxが正しくインストールされたことを確認し、サービスにアクセスします。 インストール後の作業
サンプル・アプリケーションを実行します オプション。サンプルを使用することは、MicroTxをよく理解するための最速の方法です。 サンプル・アプリケーションのデプロイ
アプリケーション・コードでのMicroTxライブラリの使用。 MicroTxと対話するライブラリにアプリケーションがアクセスできるように、すべてのトランザクション参加側およびトランザクション・イニシエータ・アプリケーションに対してこのステップを実行します。 このタスクは、使用するトランザクション・プロトコルに応じて実行します。
アプリケーションをインストールして実行します アプリケーションでライブラリ・ファイルを使用してから、アプリケーションをインストールして実行します。 アプリケーションのデプロイ