マイクロサービスにおける課題、オラクルの解決策
まずはマイクロサービスの対極にある従前のモノリシック(アプリケーション)から確認しよう。これは1つの巨大岩のようなものだ。内部でローカルトランザクションを実行するため、データベースが絶えず更新され、モジュール間には多数の依存関係があり、コードもテーブルも膨大な数を抱えている。巨大な固まりなので、保守の困難さなどさまざまな課題を抱えている。
一方、マイクロサービスはより小さな独立したモジュールで構成されるもので、各モジュールは個別に開発・テスト・デプロイされる。保守の容易さなどのメリットはあるものの、その数が多くなるとオーケストレーションの複雑性、データストアの管理、遅延の発生などで課題が生じる。
ゆえに「スケーラビリティはデータの一貫性と引き換え」と受けとめられがち。一貫性を保証する方法はいくつかあり、その1つに非同期にやりとりをして最終的に一貫性を確保するSAGAパターンがある。しかし、大量のコードが必要となり簡単ではない。扱う言語が複数であること、共通フレームワークがないこともマイクロサービスにおける課題となっている。
そのなかで、オラクルが目指すのは一貫性確保のための手間を省くことによってアプリケーション開発コストを削減し、市場投入期間の短縮を図ること。これが「Oracle Transaction Manager for Microservices(以下、TMM)」で、オラクルはインフラレベルで機能を提供しようとしている。
まず複数言語でのマイクロサービス全体のデータ一貫性を保つための手法として、複数のトランザクションモデルを用意する。XA、TCC(Try-Confirm-Cancel)、SAGAであるが、SAGAはEclipse Microprofile LRA(Long Running Actions) 規格に準拠する。エンタープライズ製品なので可用性やスケーラビリティを重視し、かつOracle Databaseとの最適化も施し、セキュリティ統合も標準搭載する。
最初はライセンス製品としてリリースし、オンプレミスでもクラウドでもKubernetes上にデプロイ可能である。今後はOracle Cloudのマネージドサービスやハイブリッド型での提供を検討している。またTMMはさまざまな言語をサポートするのが目標なので、最初のリリースではJava、Node.js、Tuxedoで使われるC/C++がサポートされ、後にGolangやPythonもサポートする。
TMM全体のアーキテクチャは下図の通り。黄色い部分がTMM、緑がアプリケーションとなる。TMMの中心となるのがトランザクションコーディネーターだ。先述したように、XA、TCC、LRAのトランザクションモデルをサポートし、これらのモデルに対してアプリケーションとリンクするためのライブラリが提供される。JavaやNode.jsにはTMMLibを使い、TuxedoはGWWS(REST APIゲートウェイ)の一部となる。他にもPL/SQLのようなデータベース常駐サービスの呼び出しにXAトランザクションを提供したり、コーディネーターに関する情報を表示するコンソールも提供される。
画面右にはKubernetesエコシステムが並ぶ。TMMと統合されるため、トランザクションコーディネーターが介在する対象範囲をPrometheusとGrafanaで監視し、Jaegerでトレースし、ELK/EFKでロギングすることも可能になる。データベースサーバのXAサポートに関しては、基本的に XAを適切にサポートするあらゆるデータベースを使用できる。
ITに携わるすべての開発者とエンジニアにお届けするオンラインイベント 「Oracle Developer Days 2022 Spring」
「未来を創造する最新テクノロジーを今、あなたの手に。」をテーマに2022年5月20日・27日に開催された オンラインイベント 「Oracle Developer Days 2022 Spring」
各セッションのアーカイブ動画と資料公開中!(登録不要)ぜひ、ご覧ください!
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」
各セッションのアーカイブ動画と資料公開中!(登録不要)ぜひ、ご覧ください!