XAトランザクションを簡単かつスケーラブルに
ここからはトランザクションマネージャーのアーキテクチャと機能に焦点を当てる。サポート対象となる最初のモデルは2フェーズコミットトランザクション(XAトランザクションとも言われる)。ACID特性を満たすので、原子性、一貫性、独立性、永続性が維持される。アプリケーションでは全体がコミットされるか、あるいは全体がロールバックされる。
もともとXAは複雑でスケーラブルではないと思われがちだ。TMMでは複雑さはオラクルのサービスとライブラリで対処できるが、スケーラビリティはアプリケーション設計と大きく関係するので、適切な対処方法についてホワイトペーパーを公開する予定だ。複数サービスで1つのトランザクションを実行して、トランザクションコンテキストがマイクロサービス間で伝わることで、各マイクロサービスが相互に連携できることになる。
TMMにおける最適化では、全てのマイクロサービスが単一のトランザクションマネージャを利用し、読み取りの準備操作しかないことを検出したら1フェーズコミットを実行する。また昇格可能トランザクションのサポートも目指しており、最初はトランザクションをローカルにして、別のリソースマネージャーが加わった時点で、グローバルトランザクションに昇格させ、2フェーズコミットプロトコルを実行させるようにする。
ロギングラストリソースという最適化も予定していて、非XAリソース参加者が1つだけであればグローバルなXAトランザクションに参加できるようにする。また、トランザクション管理のためのREST APIも提供する。XA準拠のリソース・マネージャを可能な限りサポートすることを目標としている。
アプリケーション開発を容易にするためのライブラリではインターセプターを実装している。JAX-RS(Java API for RESTful Web Services)フレームワーク上ではこのインターセプターは、外部向けコールやレスポンスをインターセプトして、特定サービスへのリクエストに対するヘッダーの変更や内容への応答を行う。このインターセプターにより、トランザクションコンテキストの伝播や、ローカルリソースマネージャーなどの操作を実行するためのコールバックなどがアプリケーションから透過的に実行できる。
特に重要なインターセプターの使用例がリソースマネジャープロキシだ。通常のXAトランザクションマネージャが介在するトランザクションの場合(画面左)、イニシエーターがアプリケーションコードを呼び出し、続いてこのアプリケーションコードがリソースマネージャを呼び出す。またイニシエーターはトランザクションマネージャを呼び出し、トランザクションマネージャはリソースマネージャと直接通信する。ここで問題となるのが呼び出したいリソースマネージャごとに固有ライブラリ、接続の確立、資格証明などが必要になることだ。
そこでTMMではリソースマネージャプロキシを使う(画面右)。イニシエーターはアプリケーションコードを呼び出すだけとなり、コミットやロールバックなどを行う時にはアプリケーションコードはインターセプターを利用するので、リソースマネージャはトランザクションマネージャの仕様を知らなくてもアクセスされるようになる。アプリケーション参加側のライブラリを用意できれば、あらゆるリソースマネージャをサポートできる。
SAGAは時間をかけて最終的に一貫性が保たれる疎結合な分散トランザクションで、現在ではよく知られているが、これはXAトランザクションにはロックの問題があってマイクロサービスでは利用が難しいと一般的には受け止められているからだ。最終的にすべて更新されるか、すべてロールバックされるか、もしくは補償するというのが全体的な考え方で、2フェーズ・モデルに似ているもののトランザクションや操作の補償については完全にアプリケーション頼りになる。
SAGAアプリケーションではサービスがまずトランザクションコーディネーターにトランザクションの開始を伝え、そのサービスが他のトランザクションサービスを呼び出す時にそのIDを伝達する。他のトランザクションサービスは受け取ったIDをトランザクションコーディネーターに登録することにより、トランザクションが完了したのか、または補償処理が必要かをトランザクションコーディネーターからのコールバックによって認識できるようにする。TMMではJavaのアノテーションでこれに対応しており、今後はTypeScriptにも広げる。
次にサポート予定のモデルはTCC(Try-Confirm-Cancel)。2フェーズコミットに似ているが、ロックではなく「予約」される点で異なる。例えば航空券とホテルとレンタカーを予約するようなケースで、まずTryフェーズが実行され、次にイニシエーターが「予約は全てOK」と伝えてコーディネーターが確認すると、全ての予約状態のトランザクションが確定となる。逆にイニシエーターが「これらのトランザクションは実行しない」とキャンセルすると、コーディネーターが全ての参加者にキャンセルを通知するというものだ。予約状態の考えが必要となり、コーディネーターが確定かキャンセルかをHTTPのメソッドを通じて実行する。
TMMの最初のリリースではOracle Database常駐アプリケーションをサポートする。これはPL/SQLプロシージャで、Oracle REST Data Services(ORDS)からアクセス可能となる。またAPEXから他のトランザクションサービスやマイクロサービスへの外部向けRESTコールが可能になる。つまりORDSアプリケーションがグローバルトランザクションに参加できるようにTMMが全てを調整する。最初のリリースではXAとTCCに対応する。
さらにサポート予定にあるのがOracle Tuxedoだ。Tuxedoは元々全てがサービスなのでマイクロサービスモデルと相性がよく、レイテンシーが極めて短いのが特徴だ。TMMを使ってOracle Tuxedoアプリケーションがマイクロサービスのグローバル・トランザクションに参加できるようになる。
GAではユーザビリティを向上する機能やパフォーマンス強化、将来の機能予定も
2022年2月にTMMベータ版をリリースし、現在検証が進んでいる。これまで述べてきたように現時点(ベータ版)では3つのトランザクションモデル、言語はJava、Node.js、C/C++(Tuxedo)、PL/SQL(Oracle Database)をサポートする。TMMはサービスメッシュでKubernetes環境にデプロイされ、サポート対象となるサービスメッシュはIstioとなる。これが製品デプロイの前提条件となる。
ベータ版ではライフサイクル管理にHelmチャートを使用する。Kubernetesエコシステムと完全に統合しており、PrometheusやGraffana、ELK/EFKで監視できる。プラットフォームとしてはOKE(Oracle Container Engine for Kubernetes)、OKD、minikubeに対応する。OpenID/JWTベースの認証と認可をサポートし、リソースマネージャはOracle DatabaseとOracle MySQLをサポートする。
GAではユーザビリティで多数の機能強化を予定している。ロギングラストリソース、XADataSource対応によるJava開発の効率化、ネストしたトランザクションなどだ。XAパフォーマンスが強化され、TMMコンソールが搭載される。またOracle Cloud Native Environment(OCNE)を始めVerrazzano、VMware Tanzuなど他のKubernetes環境のサポートを検討している。
GA以降も多数の機能開発が予定されている。TMMのKubernetes Operatorには既に着手したところだ。またPythonやGolangなどのプログラミング言語にも対応していく。Tuxedoサービスから開始するXAトランザクションのサポート、データベース常駐サービスにおけるLRAのサポートも予定している。
ITに携わるすべての開発者とエンジニアにお届けするオンラインイベント 「Oracle Developer Days 2022 Spring」
「未来を創造する最新テクノロジーを今、あなたの手に。」をテーマに2022年5月20日・27日に開催された オンラインイベント 「Oracle Developer Days 2022 Spring」
各セッションのアーカイブ動画と資料公開中!(登録不要)ぜひ、ご覧ください!