Hitachi

Hitachi Microservices Platform - Paxos Commit Transaction Orchestrator ユーザーズガイド


2.2.11 通信によるトランザクションブランチの作成(gRPC通信-サーバ)

gRPC通信によるトランザクションブランチを作成するサーバの開発方法について説明します。

gRPC通信によるトランザクションブランチの作成は、次のアプリケーションで実装してください。

サーバでは、HMP-PCTOのインタセプタを登録してトランザクションを伝搬する必要があります。また、トランザクションブランチを作成することで、通信によるトランザクションブランチのロールバック条件を設定できます。

また、分散トレースを取得するためOpenTelemetryのインタセプタをHMP-PCTOのGrpcTraceInterceptorFactoryクラスを使用して取得し、gRPCサーバに登録してください。OpenTelemetryのインタセプタをOpenTelemetryのクラスを使用して直接取得しないでください。直接取得した場合は、HMP-PCTOの初期化処理と処理順番が不定となり、Spring Bootの初期化処理中に例外が発生して、アプリケーションの起動に失敗することがあります。

インタセプタの登録方法とトランザクションブランチのロールバック条件の設定方法を次に示します。

〈この項の構成〉

(1) インタセプタの登録

(a) ライブラリの組み込み

TxPropagationGrpcServerInterceptorクラスを登録するには、以下のライブラリをアプリケーションに組み込む必要があります。

  • hmppcto-entity-service

  • hmppcto-server-grpc-interceptor

  • hmppcto-common

Gradleで組み込む記載例を次に示します。

dependencies {
    implementation 'jp.co.Hitachi.soft.hmppcto:hmppcto-entity-service:<V.R.S>'
    implementation 'jp.co.Hitachi.soft.hmppcto:hmppcto-server-grpc-interceptor:<V.R.S>'
    implementation 'jp.co.Hitachi.soft.hmppcto:hmppcto-common:<V.R.S>'
}
注※

V.R.Sは使用するHMP-PCTOのバージョンに合わせて読み替えてください。

(b) コーディング例

TxPropagationGrpcServerInterceptorクラスのインスタンスは@AutowiredアノテーションでDIして取得してください。DIしたインスタンスを使用するメソッドのアクセス制御修飾子は、private以外にしてください。privateとした場合は、HMP-PCTOの機能は正しく動作しません。

次に示す条件の場合にio.grpc.ServerBuilderクラスのintercept()メソッドを使用して登録する例を記載します。

設定項目

設定値

サービスクラス名

sampleService

サービス受信ポート番号

50051

@Autowired
TxPropagationGrpcServerInterceptor grpcServerInterceptor;
 
@Autowired
GrpcTraceInterceptorFactory  interceptorFactory;
 
int port = 50051;                    // 受信ポート
 
ServerBuilder<?> serverBuilder = ServerBuilder.forPort(port)
                                     // サービスの登録
                                     .addService(new sampleService())
                                     // トランザクション伝搬用インタセプタ登録
                                     .intercept(grpcServerInterceptor)
                                     // 分散トレース取得用インタセプタ登録
                                     .intercept(interceptorFactory.getServerInterceptor());
 
Server grpcServer = serverBuilder.build();  // サーバ作成
grpcServer.start();                         // サーバ起動

(c) エラーハンドリング

登録するインタセプタでは、アプリケーションでエラーハンドリングが必要なエラーが発生することはありません。

(2) トランザクションブランチのロールバック条件の設定

@PctoGrpcBranchRollbackForアノテーションを使用して、通信によるトランザクションブランチのロールバック条件を設定する方法を説明します。@PctoGrpcBranchRollbackForアノテーションのAPI仕様の詳細は「8.2.11 @PctoGrpcBranchRollbackForアノテーション」を参照してください。@PctoGrpcBranchRollbackForアノテーションを付与したメソッドは、別のクラスから呼び出してください。同一クラスの別メソッドから呼び出した場合は、HMP-PCTOの機能は正しく動作しません。

(a) ライブラリの組み込み

トランザクションブランチのロールバック条件を設定する場合に組み込むライブラリは、インタセプタの登録に使用するライブラリと同じです。ライブラリについては、「(a) ライブラリの組み込み」を参照してください。

(b) コーディング例

@PctoGrpcBranchRollbackForアノテーションを使用してトランザクションブランチのロールバック条件を設定するコーディング例を以下に示します。@PctoGrpcBranchRollbackForアノテーションを使用するメソッドのアクセス制御修飾子は、private以外にしてください。privateとした場合は、HMP-PCTOの機能は正しく動作しません。

@PctoGrpcBranchRollbackFor
public void service() {
    
    // 業務処理
    
}

(c) エラーハンドリング

@PctoGrpcBranchRollbackForアノテーションを設定すれば、アプリケーションでエラーハンドリングが必要なエラーが発生することはありません。