Bahasa Inggris | 简体中文
DTM adalah kerangka transaksi terdistribusi yang menyediakan konsistensi data lintas layanan. Ini menyediakan saga, tcc, xa, pesan 2 fase, kotak keluar, pola alur kerja untuk berbagai skenario aplikasi. Ini juga mendukung berbagai bahasa dan beberapa mesin toko untuk membentuk transaksi sebagai berikut:
Tencent
Bytedansi
Ivydad
Lagi
DTM dapat diterapkan pada masalah konsistensi data dalam banyak skenario, berikut beberapa skenario umum
git clone https://github.com/dtm-labs/dtm && cd dtm
go run main.go
Misalkan kita ingin melakukan transfer antar bank. Operasi transfer keluar (TransOut) dan transfer masuk (TransIn) dikodekan dalam layanan mikro terpisah.
Berikut adalah contoh untuk menggambarkan solusi dtm untuk masalah ini:
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 )
Ketika kode di atas dijalankan, kita dapat melihat di konsol bahwa layanan TransOut
, TransIn
telah dipanggil.
Jika ada operasi penerusan yang gagal, DTM akan memanggil operasi kompensasi yang sesuai dari setiap sub-transaksi untuk melakukan rollback, setelah itu transaksi berhasil dibatalkan.
Mari kita dengan sengaja memicu kegagalan sub-transaksi kedua dan melihat apa yang terjadi
// req := busi.BusiReq{Amount: 30, TransInResult: ""}
req := busi. BusiReq { Amount : 30 , TransInResult : "FAILURE" }
})
kita dapat melihat di konsol bahwa layanan TransOut
, TransIn
, TransOutRevert
telah dipanggil
Jika Anda ingin contoh memulai cepat lainnya, lihat dtm-labs/quick-start-sample
Contoh di atas terutama menunjukkan aliran transaksi terdistribusi. Lebih lanjut mengenai hal ini, termasuk contoh praktis bagaimana berinteraksi dengan database sebenarnya, bagaimana melakukan kompensasi, bagaimana melakukan rollback, dll. silakan merujuk ke dtm-examples untuk contoh lebih lanjut.
Jika menurut Anda proyek ini menarik, atau bermanfaat bagi Anda, silakan beri bintang!