Englisch | 简体中文
DTM ist ein verteiltes Transaktions-Framework, das eine dienstübergreifende Datenkonsistenz bietet. Es bietet Saga-, TCC-, XA-, 2-Phasen-Nachrichten-, Postausgangs- und Workflow-Muster für eine Vielzahl von Anwendungsszenarien. Es unterstützt auch mehrere Sprachen und mehrere Store-Engines, um eine Transaktion wie folgt zu erstellen:
Tencent
Bytedance
Ivydad
Mehr
DTM kann in einer Vielzahl von Szenarien auf Datenkonsistenzprobleme angewendet werden. Hier sind einige häufig vorkommende
git clone https://github.com/dtm-labs/dtm && cd dtm
go run main.go
Angenommen, wir möchten eine Interbanküberweisung durchführen. Die Vorgänge der ausgehenden Übertragung (TransOut) und der eingehenden Übertragung (TransIn) werden in separaten Mikrodiensten codiert.
Hier ist ein Beispiel, um eine Lösung von dtm für dieses Problem zu veranschaulichen:
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 )
Wenn der obige Code ausgeführt wird, können wir in der Konsole sehen, dass TransOut
und TransIn
aufgerufen wurden.
Wenn eine Vorwärtsoperation fehlschlägt, ruft DTM die entsprechende kompensierende Operation jeder Untertransaktion auf, um ein Rollback durchzuführen. Anschließend wird die Transaktion erfolgreich zurückgesetzt.
Lassen Sie uns absichtlich den Fehler der zweiten Untertransaktion auslösen und beobachten, was passiert
// req := busi.BusiReq{Amount: 30, TransInResult: ""}
req := busi. BusiReq { Amount : 30 , TransInResult : "FAILURE" }
})
Wir können in der Konsole sehen, dass die Dienste TransOut
, TransIn
, TransOutRevert
aufgerufen wurden
Weitere Schnellstartbeispiele finden Sie unter dtm-labs/quick-start-sample
Das obige Beispiel veranschaulicht hauptsächlich den Ablauf einer verteilten Transaktion. Mehr dazu, einschließlich praktischer Beispiele für die Interaktion mit einer tatsächlichen Datenbank, die Durchführung von Kompensationen, Rollbacks usw. Weitere Beispiele finden Sie unter dtm-examples.
Wenn Sie denken, dass dieses Projekt interessant oder hilfreich für Sie ist, geben Sie bitte einen Stern!