※ 本記事は、Todd Littleによる”Integrating Helidon and WebLogic Microservices with Oracle MicroTx“を翻訳したものです。

2023年8月15日


概要

マイクロサービスを採用している企業が増えています。これは、すべてがマイクロサービスとして開始できるグリーン・フィールド開発用です。あるいは、既存の、通常はモノリシック・アプリケーションとやり取りまたは活用する必要があるマイクロサービスを構築する場合があります。まったく新しいマイクロサービス・ベースのアプリケーションを構築して既存のアプリケーションを置き換える余裕がある企業はほとんどありません。最良の代替策は、マイクロサービスを使用して新機能を作成し、全体または部分で置き換えられるまで既存のアプリケーションを活用することです。

この投稿では、Oracle WebLogic Serverを使用して構築された既存の資金管理アプリケーションがすでに存在するユースケースについて説明します。この例はJAX-RSおよびJPAを使用しますが、JDBC、EJBまたはJMSベースのアプリケーションも、それらのアプリケーションにJAX-RSインタフェースを提供することで統合できます。

次に、この投稿で取り上げるサンプル・アプリケーションの図を示します。:

Helidon WebLogic Sample Application

サンプルについて

基本的なシナリオは、既存のWebLogic Server JAX-RS JPAベースのWebアプリケーションで、勘定科目残高を管理し、その残高に資金を預け入れたり、その残高から資金を引き出したりできます。この既存のWebLogicアプリケーションと統合する必要があるマイクロサービスを使用して、新しいアプリケーションが作成されています。これらの新しいマイクロサービスは、Helidonを使用してJavaで記述されます。預金および引出しサービスを提供します。

問題は、既存のアプリケーションと新しいマイクロサービスの間で資金を振り替えるなどの操作が原子的に行われるようにする方法です。基本的には、ソース・アカウントへの書込みと宛先アカウントへの書込みが成功するか、両方とも失敗する必要がある二重書込みの問題です。ここでは、分散トランザクションが図に示されます。通常、WebLogicアプリケーションでは、内部WebLogic Javaトランザクション・サービスが使用されます。複数のリソース・マネージャおよび他のWebLogicサーバーにデプロイされたWebLogicアプリケーション間でのXA分散トランザクション・サポートを提供します。また、WS-AtomicTransactionおよび関連するプロトコルでSOAPベースのWebサービスを使用するときに、他のアプリケーション・サーバーにまたがるトランザクションをサポートすることもできます。ただし、HelidonやNode.jsなど、他のテクノロジにまたがるトランザクションを管理する場合や、RESTベースのサービスを使用する場合には、別のソリューションが必要です。

ここで、Oracle Transaction Manager for Microservices (MicroTx)が登場します。MicroTxは、RESTベースのサービス用の外部トランザクション・コーディネータを提供します。MicroTxを使用すると、マイナーな構成変更を伴う既存のWebLogicアプリケーションを新しいHelidonベースのマイクロサービスと統合し、参加しているシステム全体でトランザクションの整合性を確保できます。

MicroTxを使用すると、マイクロサービスでトランザクションを開始し、トランザクションに含める必要がある他のマイクロサービスを呼び出すことができます。このサンプル・アプリケーションは、銀行員の一種の役割を果たしている1つのHelidonマイクロサービスを示しています。銀行員マイクロサービスを使用すると、ユーザーは、あるアカウントから別のアカウントに資金を振り替えるように要求できます。ただし、これらのアカウントは、異なるフレームワークまたは言語を使用して異なるシステムで保持される場合があります。この場合、1つのアカウントがWebLogicアプリケーションによって提供され、もう1つのアカウントはHelidonで実行される新しいマイクロサービスです。

MicroTxのWebLogicサンプル・アプリケーションなどのJPAベースのアプリケーションでは、コードの変更は不要です。MicroTxクライアント・ライブラリを含めて単一のプロパティを定義する追加構成のみが必要です。

この図は、マイクロサービス間でトランザクション・コンテキストを伝播するためにフィルタがどのように使用されるかを示しています。

MicroTx Interceptors

 

これらの構成変更が行われると、アプリケーションはMicroTxによって管理される分散トランザクションに参加できます。

新しいHelidon銀行員マイクロサービスでは、トランザクションを開始するイニシエータとしてイニシエータをコールします。必要なのは、MicroTxクライアント・ライブラリを含めて@Transactional注釈を追加することのみです。:

@Transactional(Transactional.TxType.REQUIRED)

転送関数を処理するメソッドについて。この注釈は、このメソッドがトランザクションの一部である必要があることをMicroTxに指示し、まだ存在していない場合は新しいトランザクションを開始します。また、メソッドが正常に戻ると、トランザクションはMicroTxによって自動的にコミットされます。メソッドによって例外が生成されると、トランザクションは自動的にロールバックされます。

銀行員マイクロサービスが参加者の1人から資金を取り下げるRESTコールを行うと、MicroTxクライアント・ライブラリ・フィルタによってアウトバウンドRESTリクエストにヘッダーが追加され、参加者にトランザクションに参加する必要があることが示されます。次に、参加者の受信フィルタは、MicroTxコーディネータをコールしてトランザクションに参加者を登録し、参加者でトランザクション・コンテキストを確立します。

銀行員マイクロサービスがトランザクションのコミットを決定すると、成功が返され、MicroTxライブラリはトランザクション・コーディネータをコールしてトランザクションのコミットを要求します。次に、トランザクション調整サービスは、登録された各参加者に連絡して準備を依頼します。成功すると、すべての参加者にコミットするよう求められます。1人以上の参加者が準備できない場合、または開始者がトランザクションを中止することにした場合、そのトランザクションはロールバックされます。それ以外の場合、トランザクションはコミットされます。イニシエータは、例外をスローすることでトランザクションを中止できます。

次の図に、この全体的なフローを示します。:

Helidon WebLogic Sample Transaction Flow

 

前述のトランザクション・フローでは、MicroTxは、アプリケーション開発者が不要になるように分散トランザクション処理の詳細を管理します。緑色の相互作用は、MicroTxライブラリによって完全に処理されます。開発者の観点から見ると、MicroTxによってこの操作が簡単になります。Helidon内の注釈を使用し、WebLogic Server内の構成を使用すると、MicroTXによって分散トランザクションが自動的に管理されます。

これは、XAトランザクションが通常処理される方法とは少し異なることに注意してください。一般的なXAトランザクション・マネージャ実装では、トランザクション・マネージャがリソース・マネージャに独自の接続を持ちます。つまり、トランザクション・マネージャには、独自の資格証明とリソース・マネージャに適したクライアント・ライブラリが必要です。MicroTxトランザクション・マネージャが任意のリソース・マネージャをサポートできるようにするには、すでにリソース・マネージャに接続されている参加者にそのリクエストをプロキシします。これにより、MicroTxトランザクション・コーディネータは、主にリソース・マネージャに依存しません。

まとめ

MicroTxを外部トランザクション・コーディネータとして使用すると、既存のWebLogicアプリケーションを新しいマイクロサービスと統合しながら、参加者全体でデータの一貫性を確保できます。MicroTxライブラリを使用すると、WebLogicアプリケーションでコードを変更することなく、MicroTxを非常に簡単に使用できます。今後のブログ投稿では、MicroTx管理対象トランザクションにEJBおよびJMSベースのWebLogicアプリケーションを含める方法について説明します。