영어 | 简体中文
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은 각 하위 트랜잭션의 해당 보상 작업을 호출하여 롤백한 후 트랜잭션이 성공적으로 롤백됩니다.
의도적으로 두 번째 하위 트랜잭션의 실패를 유발하고 무슨 일이 일어나는지 살펴보겠습니다.
// req := busi.BusiReq{Amount: 30, TransInResult: ""}
req := busi. BusiReq { Amount : 30 , TransInResult : "FAILURE" }
})
TransOut
, TransIn
, TransOutRevert
서비스가 호출되었음을 콘솔에서 볼 수 있습니다.
더 많은 빠른 시작 예시를 원하시면 dtm-labs/quick-start-sample을 참조하세요.
위의 예는 주로 분산 트랜잭션의 흐름을 보여줍니다. 실제 데이터베이스와 상호 작용하는 방법, 보상 수행 방법, 롤백 수행 방법 등에 대한 실제 예를 포함하여 이에 대한 자세한 내용은 dtm-examples를 참조하세요.
이 프로젝트가 흥미롭거나 도움이 된다고 생각하시면 별점을 주세요!