英語 | 简体中文
DTM は、サービス間の最終的なデータ整合性を提供する分散トランザクション フレームワークです。さまざまなアプリケーション シナリオに対応する、saga、tcc、xa、2 フェーズ メッセージ、送信ボックス、ワークフロー パターンを提供します。また、次のようにトランザクションを形成するための複数の言語と複数のストア エンジンもサポートしています。
テンセント
バイトダンス
イビダッド
もっと
DTM は、多くのシナリオにおけるデータ整合性の問題に適用できます。ここでは、一般的なシナリオをいくつか紹介します。
git clone https://github.com/dtm-labs/dtm && cd dtm
go run main.go
銀行間送金を実行したいとします。転送出力 (TransOut) と転送入力 (TransIn) の操作は、別個のマイクロサービスでコーディングされます。
この問題に対する dtm の解決策を示す例を次に示します。
git clone https://github.com/dtm-labs/quick-start-sample.git && cd quick-start-sample/workflow-grpc
go run main.go
wfName := "workflow-grpc"
err = workflow . Register ( wfName , func ( wf * workflow. Workflow , data [] byte ) error {
// ...
// Define a transaction branch for TransOut
wf . NewBranch (). OnRollback ( func ( bb * dtmcli. BranchBarrier ) error {
// compensation for TransOut
_ , err := busiCli . TransOutRevert ( wf . Context , & req )
return err
})
_ , err = busiCli . TransOut ( wf . Context , & req )
// check error
// Define another transaction branch for TransIn
wf . NewBranch (). OnRollback ( func ( bb * dtmcli. BranchBarrier ) error {
_ , err := busiCli . TransInRevert ( wf . Context , & req )
return err
})
_ , err = busiCli . TransIn ( wf . Context , & req )
return err
}
// ...
req := busi . BusiReq { Amount : 30 , TransInResult : "" }
data , err := proto. Marshal ( & req )
// Execute workflow
_ , err = workflow . ExecuteCtx ( wfName , shortuuid . New (), data )
logger . Infof ( "result of workflow.Execute is: %v" , err )
上記のコードを実行すると、サービスTransOut
、 TransIn
が呼び出されたことがコンソールに表示されます。
転送操作が失敗した場合、DTM は各サブトランザクションの対応する補償操作を呼び出してロールバックし、その後トランザクションは正常にロールバックされます。
2 番目のサブトランザクションの失敗を意図的にトリガーして、何が起こるかを見てみましょう
// req := busi.BusiReq{Amount: 30, TransInResult: ""}
req := busi. BusiReq { Amount : 30 , TransInResult : "FAILURE" }
})
コンソールでは、サービスTransOut
、 TransIn
、 TransOutRevert
が呼び出されていることがわかります。
さらにクイック スタートの例が必要な場合は、dtm-labs/quick-start-sample を参照してください。
上記の例は、主に分散トランザクションの流れを示しています。実際のデータベースと対話する方法、補償を行う方法、ロールバックを行う方法などの実践的な例を含む詳細については、dtm-examples を参照してください。
このプロジェクトが面白い、または役に立つと思われた場合は、スターを付けてください。