Inglés | 简体中文
DTM es un marco de transacciones distribuidas que proporciona coherencia de datos eventual entre servicios. Proporciona saga, tcc, xa, mensajes de 2 fases, bandeja de salida y patrones de flujo de trabajo para una variedad de escenarios de aplicaciones. También admite múltiples idiomas y múltiples motores de tienda para realizar una transacción de la siguiente manera:
Tencent
bytedancia
Ivydad
Más
DTM se puede aplicar a problemas de coherencia de datos en una gran cantidad de escenarios; a continuación se muestran algunos de los más comunes
git clone https://github.com/dtm-labs/dtm && cd dtm
go run main.go
Supongamos que queremos realizar una transferencia interbancaria. Las operaciones de transferencia de salida (TransOut) y transferencia de entrada (TransIn) están codificadas en microservicios separados.
A continuación se muestra un ejemplo para ilustrar una solución de dtm a 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 )
Cuando se ejecuta el código anterior, podemos ver en la consola que da servicio TransOut
, se ha llamado TransIn
.
Si alguna operación de reenvío falla, DTM invoca la operación de compensación correspondiente de cada subtransacción para revertir, después de lo cual la transacción se revierte con éxito.
Provoquemos deliberadamente el fallo de la segunda subtransacción y observemos qué sucede.
// req := busi.BusiReq{Amount: 30, TransInResult: ""}
req := busi. BusiReq { Amount : 30 , TransInResult : "FAILURE" }
})
podemos ver en la consola que los servicios TransOut
, TransIn
, TransOutRevert
han sido llamados
Si desea más ejemplos de inicio rápido, consulte dtm-labs/quick-start-sample
El ejemplo anterior demuestra principalmente el flujo de una transacción distribuida. Más sobre esto, incluidos ejemplos prácticos de cómo interactuar con una base de datos real, cómo realizar una compensación, cómo realizar una reversión, etc. Consulte dtm-examples para obtener más ejemplos.
Si crees que este proyecto es interesante o útil para ti, ¡dale una estrella!