2.2.10 通信によるトランザクションブランチの作成(gRPC通信-クライアント)
gRPC通信によるトランザクションブランチを作成するクライアントの開発方法について説明します。
gRPC通信によるトランザクションブランチの作成は、次のアプリケーションで実装してください。
-
Orchestrator-Service
-
Relay-Service
-
Entity-Service(SQL)
-
Entity-Service(TCC)
-
Orchestrator-Service(SQL)
-
Alternate-Service
-
Alternate-Service(SQL)
クライアントでは、インタセプタを登録してトランザクションを伝搬する必要があります。また、トランザクションブランチを作成することで、先行プリペア機能を使用できます。
インタセプタの登録方法と、先行プリペア機能の使用方法を次に示します。
(1) gRPCのManagedChannelを使用したインタセプタの登録
ManagedChannelBuilder、またはそのサブクラスにHMP-PCTOが提供するTxPropagationGrpcClientInterceptorクラスを登録して使用します。
また、分散トレースを取得するためOpenTelemetryのインタセプタをHMP-PCTOのGrpcTraceInterceptorFactoryクラスを使用して取得し、ManagedChannelBuilderまたはそのサブクラスに登録してください。OpenTelemetryのインタセプタは、OpenTelemetryのクラスを直接使用して取得しないでください。直接取得した場合は、HMP-PCTOの初期化処理と処理順番が不定となり、Spring Bootの初期化処理中に例外が発生して、アプリケーションの起動に失敗することがあります。
(a) ライブラリの組み込み
ManagedChannelWrapperクラスを使用するには、以下のライブラリをアプリケーションに組み込む必要があります。
-
hmppcto-propagation-grpc
-
hmppcto-common
Gradleで組み込む記載例を次に示します。
dependencies {
implementation 'jp.co.Hitachi.soft.hmppcto:hmppcto-propagation-grpc:<V.R.S>※'
implementation 'jp.co.Hitachi.soft.hmppcto:hmppcto-common:<V.R.S>※'}
- 注※
-
V.R.Sは使用するHMP-PCTOのバージョンに合わせて読み替えてください。
(b) 宛先のホスト部分の形式
トランザクションの伝搬時、gRPC通信に指定する宛先のホスト部分は、宛先のServiceを示すドメイン名で指定してください。詳細については「(b) 宛先のホスト部分の形式 」の形式を参照してください。
(c) コーディング例
次に示す条件の場合にio.grpc.ManagedChannelBuilderクラスを使用した例を記載します。
|
設定項目 |
設定値 |
|---|---|
|
gRPCのサービス名 |
sampleService |
|
gRPCのメソッド名 |
sampleMethod |
|
gRPCの送信先 |
grpc-service:50051 |
@Autowired
TxPropagationGrpcClientInterceptor grpcClientInterceptor;
@Autowired
GrpcTraceInterceptorFactory interceptorFactory;
String host = "grpc-service"; // 送信先ホスト
int port = 50051; // 送信先ポート
ManagedChannelBuilder<?> chBuilder = ManagedChannelBuilder.forAddress(host, port); // ChannelBuilder作成
ManagedChannel ch = chBuilder.usePlaintext() // ManagedChannel作成
// トランザクション伝搬用インタセプタ登録
.intercept(grpcClientInterceptor)
// 分散トレース取得用インタセプタ登録
.intercept(interceptorFactory.getClientInterceptor())
.build();
(d) エラーハンドリング
HMP-PCTOが自動的に組み込むインタセプタでは、アプリケーションでエラーハンドリングが必要なエラーが発生することはありません。
(2) 先行プリペア機能の使用
先行プリペア機能を使用するには、トランザクションを伝搬する際にクライアントアプリケーションでHMP-PCTOが提供するインタフェースを使用して、先行プリペア機能を使用するかどうかを切り替えます。
(a) ライブラリの組み込み
先行プリペア機能を使用する場合に組み込むライブラリは、トランザクションの伝搬に使用するライブラリと同じです。ライブラリについては、「(a) ライブラリの組み込み」を参照してください。
(b) コーディング例
同じサービスを複数回呼び出す際の例を示します。
同じサービスを複数回呼び出す際に、サービスの呼び出し直前に先行プリペア機能の使用有無を切り替える方法と、サービスの呼び出し前後で先行プリペア機能の使用有無を切り替える方法があります。
ここでは、サービス呼び出し前後で先行プリペア機能の使用有無を切り替える場合の例を記載します。メソッドの詳細については、「8.2.4 XidHeadersインタフェース(SQL-Participant限定)」を参照してください。
sampleServiceBlockingStub serviceStub = sampleServiceGrpc.newBlockingStub(ch); // Stub作成 serviceStub.sampleMethod1(); // 先行プリペア機能を使用しないでサービス呼び出し TxPropagationOptionalSettings.setPrePrepared(true); // 先行プリペア機能を「使用する」に設定 serviceStub.sampleMethod2(); // 先行プリペア機能を使用してサービス呼び出し TxPropagationOptionalSettings.setPrePrepared(false); // 先行プリペア機能を「使用しない」に設定
(c) エラーハンドリング
先行プリペア機能を使用するかどうかを切り替えれば、アプリケーションでエラーハンドリングが必要なエラーが発生することはありません。
(3) 注意事項
先行プリペア機能を使用してサービスを呼び出したあとに、同じトランザクションブランチのサービスを呼び出す場合、呼び出し先のサービスでSQLは実行できません。SQLを実行するためにJDBC Proxy Driverのメソッドを実行した場合は、PctoPrePreparedException例外を送出して、SQLを実行しないで無視します。トランザクションがコミットするかロールバックするかには影響しません。呼び出し先のサービスでPctoPrePreparedException例外をキャッチしてロールバックするかどうかを判断してください。