※ 本記事は、Todd Littleによる”New Release of MicroTx 22.3.2“を翻訳したものです。
2023年5月19日
Oracle Transaction Manager for Microservices (MicroTx) 22.3.2の発表
Oracleは、新しいリリースのMicroTxを使用して、エンタープライズ顧客向けのマイクロサービスに対するコミットメントを継続的に示しています。このリリースには、マイクロサービス・ベースのアプリケーションでの一貫性の問題を解決するために顧客が要求する機能が含まれています。特に、XAトランザクションを使用するお客様がマイクロサービス全体で強力なデータ整合性を確保するためのいくつかの機能が含まれています。この記事では、これらの新機能の詳細を紹介します。
XAトランザクションの最終リソース・コミット最適化
データベースやメッセージング・システムなど、すべてのリソース・マネージャがXAトランザクションをサポートしているわけではありません。非XA準拠のリソース・マネージャを使用する必要があるマイクロサービスは、リソース・マネージャをXA分散トランザクションに含める必要がある場合があります。最終リソース・コミット(LRC)の最適化では、1つの非XA準拠リソース・マネージャをXAトランザクションに含めることができますが、いくつかの制限があります。この最適化は、ロギング・ラスト・リソース(LLR)トランザクションの最適化に非常に似ていますが、1つの違いがあります。LLRでは、トランザクション・コーディネータがLLR参加者にトランザクション・コミット・レコードの格納を依頼します。これには、MicroTxクライアント・ライブラリが、MongoDBなどのLLRリソースにデータを格納する方法を理解する必要があります。場合によっては、コミット・レコードを非XA準拠のリソース・マネージャに格納できないため、別のアプローチが必要になることがあります。そこで登場するのがLRCです。LRCを使用すると、トランザクション・コーディネータはすべてのXA参加者を準備し、LRC参加者にローカル・トランザクションのコミットを依頼します。そのローカル・コミット・リクエストの結果によって、トランザクションの結果が決まります。LRCローカル・コミットが失敗した場合、トランザクション・コーディネータは準備されたすべてのXA参加者にロールバックを指示します。LRCローカル・コミットの結果が成功した場合、トランザクション・コーディネータは準備されたすべてのXA参加者にコミットを指示します。
LRC over LLRまたはXAリソースを使用する主な欠点は、ヒューリスティックな結果の可能性を高めることです。ヒューリスティックな結果は、一部の参加者がコミットし、他の参加者がロールバックした場合、または1人以上の参加者の結果が不明の場合です。事実上、すべての分散トランザクション・モデルはヒューリスティックな結果を持つことができますが、XAは一般に、2フェーズ・コミット・プロトコルを介してこれらを最小化します。LRCでは、LRCリソースがローカル・トランザクションを正常にコミットするとヒューリスティックな結果が発生しますが、失敗によってトランザクション・コーディネータが正常なレスポンスを取得できなくなる場合があります。これにより、トランザクション・コーディネータは、コミット・リクエストが失敗したと誤って判断し、準備されたすべてのXA参加者のロールバックに進みます。
複数のリソース・マネージャを使用したマイクロサービス参加者
通常、マイクロサービスは、必要な永続的な状態を格納するために単一のリソース・マネージャのみを使用します。ただし、単一のマイクロサービスで複数のリソース・マネージャを使用すると便利な場合があります。この簡単な例は、キューからメッセージを削除してデータベース操作を実行するマイクロサービスです。次に示すもう1つの例は、Oracle DatabaseやPostgreSQLなどの2つの異なるデータベースを使用する必要があることです。アプリケーションは、MicroTxクライアント・ライブラリによってインジェクトされた接続を使用します。:
/** * The Database Connection injected by the TMM Library. Use this connection object to execute SQLs (DMLs) within the application code. */ @Inject @TrmSQLConnection(name = "departmentDataSource") private Connection connection; @Inject @TrmSQLConnection(name = "creditDataSource") private Connection creditConnection;
接続はアプリケーション,yamlで定義されます。
#Modify the below to provide database connection details for your database departmentDataSource: url : "jdbc:oracle:thin:@tcps://XXXXwallet_location=Database_Wallet" user: "XXXX" password: "XXXXX" rmid : "4F58D282-0DE1-453C-B872-291FDBF49CFF" creditDataSource: url: "jdbc:postgresql://<link>:<port>/<database>" user: "XXXX" password: "XXXX" rmid : "4F58D282-0DE1-453C-B872-291FDBF49CGG"
これにより、同じトランザクションでOracle Database接続とPostgreSQLデータベース接続の両方を同じマイクロサービスで使用できます。
Try-Confirm/CancelのPythonサポート
この新しいリリースには、FlaskまたはDjangoを使用して構築されたPythonアプリケーションでTry-Confirm/Cancel (TCC)トランザクション・プロトコルを使用するためのサポートが含まれています。TCCの他の言語サポートと同様に、アプリケーション・コードは、次のRESTエンドポイントを提供する必要があります。:
- POSTを使用した予約
- PUTを使用した予約の確認
- DELETEを使用した予約の削除
TCCトランザクションの新しい参加者は、TCCConfig.addTccParticipant(URI)メソッドを使用して追加されます。
トランザクション・イベント通知
トランザクション・コーディネータがXAトランザクションの準備フェーズを開始する前、およびコミット/ロールバック・フェーズ後に、トランザクション参加者に通知を受け取ると便利な場合があります。これの一般的なユース・ケースは、メモリーにキャッシュされたデータをデータベースにフラッシュできるようにすることです。リソース・マネージャから一部のデータを読み取り、そのデータをメモリーで変更し、トランザクションを完了する準備ができた参加者。データがリソース・マネージャでまだ更新されていないため、関係者はトランザクションをコミットする前にリソース・マネージャを更新する必要があります。beforeCompletionイベントに登録すると、参加者は、準備フェーズを開始する前にトランザクション・コーディネータからコールバックを受け取ります。これにより、参加者は、更新されたデータを関連するリソース・マネージャにメモリーに保持できます。参加者は、コミット/ロールバック後にメモリー内のものをクリーン・アップする必要がある場合もあるため、afterCompletionイベントに登録し、トランザクションがコミットまたはロールバックされるとコール・バックできます。
