Inglês | 简体中文
DTM é uma estrutura de transação distribuída que fornece consistência de dados eventual entre serviços. Ele fornece padrões de fluxo de trabalho saga, tcc, xa, mensagem bifásica, caixa de saída para uma variedade de cenários de aplicativos. Ele também oferece suporte a vários idiomas e vários mecanismos de armazenamento para formar uma transação da seguinte forma:
Tencent
Bytedância
Ivydad
Mais
O DTM pode ser aplicado a problemas de consistência de dados em um grande número de cenários. Aqui estão alguns dos mais comuns
git clone https://github.com/dtm-labs/dtm && cd dtm
go run main.go
Suponha que queiramos realizar uma transferência interbancária. As operações de transferência de saída (TransOut) e transferência de entrada (TransIn) são codificadas em microsserviços separados.
Aqui está um exemplo para ilustrar uma solução de dtm para este problema:
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 )
Quando o código acima é executado, podemos ver no console que o serviço TransOut
, TransIn
foi chamado.
Se alguma operação de encaminhamento falhar, o DTM invoca a operação de compensação correspondente de cada subtransação para reverter, após o que a transação é revertida com sucesso.
Vamos acionar propositalmente a falha da segunda subtransação e observar o que acontece
// req := busi.BusiReq{Amount: 30, TransInResult: ""}
req := busi. BusiReq { Amount : 30 , TransInResult : "FAILURE" }
})
podemos ver no console que os serviços TransOut
, TransIn
, TransOutRevert
foram chamados
Se você quiser mais exemplos de início rápido, consulte dtm-labs/quick-start-sample
O exemplo acima demonstra principalmente o fluxo de uma transação distribuída. Mais sobre isso, incluindo exemplos práticos de como interagir com um banco de dados real, como fazer compensação, como fazer rollback, etc. consulte exemplos de dtm para mais exemplos.
Se você acha que este projeto é interessante ou útil para você, dê uma estrela!