الإنجليزية | 简体中文
DTM هو إطار عمل موزع للمعاملات يوفر تناسقًا نهائيًا للبيانات عبر الخدمات. فهو يوفر الملحمة، وtcc، وxa، والرسائل ثنائية الطور، وصندوق الصادر، وأنماط سير العمل لمجموعة متنوعة من سيناريوهات التطبيق. كما أنه يدعم لغات متعددة ومحرك متجر متعدد لتكوين معاملة على النحو التالي:
تينسنت
بايت دانس
ايفيداد
أكثر
يمكن تطبيق 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 لمزيد من الأمثلة.
إذا كنت تعتقد أن هذا المشروع مثير للاهتمام أو مفيد لك، فيرجى إعطاء نجمة!