Anglais | 简体中文
DTM est un cadre de transaction distribué qui assure la cohérence éventuelle des données entre services. Il fournit des modèles de flux de travail Saga, TCC, XA, message en 2 phases, boîte d'envoi pour une variété de scénarios d'application. Il prend également en charge plusieurs langues et plusieurs moteurs de magasin pour former une transaction comme suit :
Tencent
Byté danse
Ivydad
Plus
Le DTM peut être appliqué aux problèmes de cohérence des données dans un grand nombre de scénarios, en voici quelques-uns courants
git clone https://github.com/dtm-labs/dtm && cd dtm
go run main.go
Supposons que nous souhaitions effectuer un virement interbancaire. Les opérations de transfert sortant (TransOut) et de transfert entrant (TransIn) sont codées dans des micro-services distincts.
Voici un exemple pour illustrer une solution de dtm à ce problème :
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 )
Lorsque le code ci-dessus s'exécute, nous pouvons voir dans la console que les services TransOut
, TransIn
ont été appelés.
Si une opération de transfert échoue, DTM appelle l'opération de compensation correspondante de chaque sous-transaction pour annuler, après quoi la transaction est annulée avec succès.
Déclenchons volontairement l'échec de la deuxième sous-transaction et observons ce qui se passe
// req := busi.BusiReq{Amount: 30, TransInResult: ""}
req := busi. BusiReq { Amount : 30 , TransInResult : "FAILURE" }
})
on peut voir dans la console que les services TransOut
, TransIn
, TransOutRevert
ont été appelés
Si vous souhaitez plus d'exemples de démarrage rapide, veuillez vous référer à dtm-labs/quick-start-sample
L'exemple ci-dessus démontre principalement le flux d'une transaction distribuée. Pour en savoir plus à ce sujet, y compris des exemples pratiques sur la façon d'interagir avec une base de données réelle, comment effectuer une compensation, comment effectuer une restauration, etc. veuillez vous référer à dtm-examples pour plus d'exemples.
Si vous pensez que ce projet est intéressant ou utile pour vous, donnez une étoile !