1 MicroTxについて

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

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

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

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

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

1.2 MicroTxのコンポーネント

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

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

MicroTxのコンポーネント

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

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

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

MicroTxライブラリ

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

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

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

1.3 MicroTxの仕組み

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

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

1.4 アプリケーション・コードでのMicroTxライブラリの使用

MicroTxを使用してアプリケーション内のトランザクションを管理するには、既存のアプリケーション・コードをいくつか変更して、MicroTxライブラリによって提供される機能を統合する必要があります。

サンプルJavaアプリケーションを使用して、アプリケーション開発者が行う必要がある変更について理解しましょう。このサンプル・アプリケーションは、ある部門から別の部門に送金する銀行振込アプリケーションです。サンプルXAアプリケーション・コード・ファイルは、インストール・バンドルのinstallation_directory/otmm-RELEASE/samples/XAフォルダにあります。MicroTxライブラリはすでにサンプル・アプリケーション・コードと統合されています。

Java用のMicroTxライブラリは次の関数を実行します:

  • 参加側サービスをトランザクション内でトランザクション・コーディネータに登録します。
  • 参加側アプリケーション・コードが依存性インジェクションを介して使用するようにXADataSourceオブジェクトを注入してから、関連付けられたXAResourceに対してstart()をコールします。参加側マイクロサービス(XAトランザクションのコンテキストでコールされるマイクロサービス)は、XA準拠データ・ソースを使用する必要があります。Javaでは、これはXADataSourceオブジェクトの使用を意味します。

    MicroTxライブラリは、構成済のデータ・ソースを参加側サービスに自動的に注入するため、アプリケーション開発者は@Injectまたは@Context注釈をアプリケーション・コードに追加する必要があります。アプリケーション・コードは、この関連付けを使用してDMLを実行します。

  • リソース・マネージャをコールして操作を実行します。

次に示すサンプルXAアプリケーション(Java)のコード・スニペットの太字で強調表示されたコード行は、通常行われる変更または追加を示しています。

package com.oracle.mtm.sample.data;
...
/**
 * Include the Transaction Manager for Microservices library files.
 */

import com.oracle.mtm.sample.Configuration;
import com.oracle.mtm.sample.entity.Account;
import oracle.trm.jta.common.TrmSQLConnection;

/**
 * Service that connects to the accounts database and provides methods to interact with the accounts
 */
@RequestScoped
public class AccountsService implements IAccountsService {

    /**
     * The database connection injected by the Transaction Manager for Microservices library.
     * Use this connection object to execute SQLs (DMLs) within the application code.
     */
    @Inject
    @TrmSQLConnection
    private Connection connection;

    @Inject
    private Configuration config;
...
    @Override
    public boolean withdraw(String accountId, double amount) throws SQLException {
        String query = "UPDATE accounts SET amount=amount-? where account_id=?";      
        /**
         * Use the connection object that the Transaction Manager for Microservices library
         * injects in the application code.
         */
       PreparedStatement statement = connection.prepareStatement(query);
        statement.setDouble(1, amount);
        statement.setString(2, accountId);
        return statement.executeUpdate() > 0;
    }
... 
    
}

このサンプル・コードは、読みやすくするために...を使用して一部を省いています。サンプル・コード全体を確認するには、インストール・バンドルのinstallation_directory/otmm-RELEASE/samples/XAフォルダにあるサンプルXAアプリケーション・コード・ファイルを参照してください。