dtm README

The project's README from github.com/dtm-labs/dtm. As one markdown file: README.md.

license Build Status codecov Go Report Card Go Reference Mentioned in Awesome Go

English | 简体中文

Distributed Transactions Manager

What is DTM

DTM is a distributed transaction framework which provides cross-service eventual data consistency. It provides saga, tcc, xa, 2-phase message, outbox, workflow patterns for a variety of application scenarios. It also supports multiple languages and multiple store engine to form up a transaction as following:

function-picture

Who's using DTM (partial)

Tencent

Bytedance

Ivydad

More

Features

Application scenarios.

DTM can be applied to data consistency issues in a large number of scenarios, here are a few common ones

Cook Book

Quick start

run dtm

git clone https://github.com/dtm-labs/dtm && cd dtm
go run main.go

Start an example

Suppose we want to perform an inter-bank transfer. The operations of transfer out (TransOut) and transfer in (TransIn) are coded in separate micro-services.

Here is an example to illustrate a solution of dtm to this problem:

git clone https://github.com/dtm-labs/quick-start-sample.git && cd quick-start-sample/workflow-grpc
go run main.go

Code

Usage

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)

When the above code runs, we can see in the console that services TransOut, TransIn has been called.

Rollback upon failure

If any forward operation fails, DTM invokes the corresponding compensating operation of each sub-transaction to roll back, after which the transaction is successfully rolled back.

Let's purposely trigger the failure of the second sub-transaction and watch what happens

// req := busi.BusiReq{Amount: 30, TransInResult: ""}
req := busi.BusiReq{Amount: 30, TransInResult: "FAILURE"}
})

we can see in the console that services TransOut, TransIn, TransOutRevert has been called

More examples

If you want more quick start examples, please refer to dtm-labs/quick-start-sample

The above example mainly demonstrates the flow of a distributed transaction. More on this, including practical examples of how to interact with an actual database, how to do compensation, how to do rollback, etc. please refer to dtm-examples for more examples.

Give a star! ⭐

If you think this project is interesting, or helpful to you, please give a star!

dtm (dtm-labs/dtm)

Searching Database…

10.9K ·GitHub
Что это такое?DTM — это фреймворк распределённых транзакций, который обеспечивает итоговую согласованность данных между сервисами. Он реализует шаблоны saga, TCC, XA, двухфазные сообщения, outbox и workflow для разных прикладных сценариев.
Это библиотека, которую я подключаю в свой код, или отдельный сервис, который я запускаю?И то и другое: отдельный сервер dtm обрабатывает транзакции, а ваши сервисы общаются с ним через SDK для Go, Java, PHP, C#, Python и Node.js.
Как мне запустить свою первую транзакцию?В разделе Quick start в README предлагается запустить сервер dtm, а затем пример межбанковского перевода, где TransOut и TransIn живут в отдельных микросервисах; больше примеров — в репозитории dtm-labs/quick-start-sample.
С какими базами данных он умеет координировать транзакции?Для веток транзакций поддерживаются MySQL/MariaDB, Redis, MongoDB, Postgres и TDSQL. Для собственного хранилища dtm обычно выбирают MySQL/MariaDB, Redis — вариант для высокой производительности, BoltDB — для разработки и тестов.
Что произойдёт, если один шаг транзакции упадёт посреди процесса?DTM вызывает соответствующую компенсирующую операцию каждой под-транзакции, чтобы откатить всё целиком. В демо из README вторая под-транзакция специально завершается ошибкой, и видно, как вызывается TransOutRevert.
Насколько он надёжен, чтобы строить на нём продакшен-систему?Он создан для высокой доступности и простого горизонтального масштабирования, а в README среди его пользователей указаны Tencent, Bytedance и Ivydad.
Что за «более удачный outbox», о котором говорит README?Это шаблон двухфазных сообщений: автор представляет его как более элегантное решение, чем классический outbox, и он работает сразу с несколькими базами данных.
Для каких сценариев он на самом деле предназначен?Управление согласованностью кэша, списание товара на распродажах в Redis, которое должно в точности совпадать с созданными заказами, немонолитные системы заказов, а также публикация и подписка на события.
Могу ли я уже использовать MongoDB в качестве хранилища dtm?Пока нет: в README MongoDB указана как планируемый движок хранения, так что пока используйте MySQL/MariaDB или Redis.
Он интегрируется с конкретными фреймворками для микросервисов на Go?Да, он поддерживает из коробки архитектуры микросервисов go-zero, go-kratos/kratos и polarismesh/polaris.
Creator
dtm-labs
Size
3.4 MB
Stars
10.9K
Age
5y
Commits · 90 Days