английский | 简体中文
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-examples.
Если вы считаете, что этот проект интересен или полезен для вас, поставьте звездочку!