อังกฤษ | 简体中文
DTM คือกรอบงานธุรกรรมแบบกระจายซึ่งให้ความสอดคล้องของข้อมูลในขั้นสุดท้ายระหว่างบริการ โดยนำเสนอรูปแบบ saga, tcc, xa, ข้อความ 2 เฟส, กล่องขาออก และเวิร์กโฟลว์สำหรับสถานการณ์การใช้งานที่หลากหลาย นอกจากนี้ยังรองรับหลายภาษาและเครื่องมือร้านค้าหลายรายการเพื่อสร้างธุรกรรมดังต่อไปนี้:
เทนเซ็นต์
ไบต์แดนซ์
ไอวีดัด
มากกว่า
DTM สามารถนำไปใช้กับปัญหาความสอดคล้องของข้อมูลได้ในสถานการณ์จำนวนมาก ต่อไปนี้เป็นสถานการณ์ทั่วไปบางส่วน
git clone https://github.com/dtm-labs/dtm && cd dtm
go run main.go
สมมติว่าเราต้องการทำการโอนเงินระหว่างธนาคาร การดำเนินการถ่ายโอนออก (TransOut) และถ่ายโอนเข้า (TransIn) ได้รับการเข้ารหัสในไมโครเซอร์วิสที่แยกจากกัน
นี่คือตัวอย่างที่แสดงให้เห็นวิธีแก้ปัญหาของ dtm สำหรับปัญหานี้:
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 )
เมื่อโค้ดด้านบนทำงาน เราจะเห็นได้ในคอนโซลที่ให้บริการ TransOut
, TransIn
ที่ถูกเรียกใช้
หากการดำเนินการส่งต่อล้มเหลว DTM จะเรียกใช้การดำเนินการชดเชยที่สอดคล้องกันของธุรกรรมย่อยแต่ละรายการเพื่อย้อนกลับ หลังจากนั้นธุรกรรมจะถูกย้อนกลับได้สำเร็จ
เรามากระตุ้นความล้มเหลวของธุรกรรมย่อยครั้งที่สองโดยเจตนาและดูว่าเกิดอะไรขึ้น
// req := busi.BusiReq{Amount: 30, TransInResult: ""}
req := busi. BusiReq { Amount : 30 , TransInResult : "FAILURE" }
})
เราจะเห็นได้ในคอนโซลว่าบริการ TransOut
, TransIn
, TransOutRevert
ได้รับการเรียก
หากคุณต้องการตัวอย่างการเริ่มต้นอย่างรวดเร็วเพิ่มเติม โปรดดูที่ dtm-labs/quick-start-sample
ตัวอย่างข้างต้นแสดงให้เห็นถึงขั้นตอนของธุรกรรมแบบกระจายเป็นหลัก ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ รวมถึงตัวอย่างเชิงปฏิบัติของวิธีโต้ตอบกับฐานข้อมูลจริง วิธีชดเชย วิธีย้อนกลับ ฯลฯ โปรดดูตัวอย่างเพิ่มเติมที่ตัวอย่าง dtm
หากคุณคิดว่าโครงการนี้น่าสนใจหรือเป็นประโยชน์ต่อคุณ โปรดให้ดาว!