マイクロサービスにおける課題、オラクルの解決策
まずはマイクロサービスの対極にある従前のモノリシック(アプリケーション)から確認しよう。これは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」
各セッションのアーカイブ動画と資料公開中!(登録不要)ぜひ、ご覧ください!