tonglin0325的个人主页

go学习笔记——分布式事务框架DTM

DTM是一款开源的GO语言分布式事务管理器,解决跨数据库、跨服务、跨语言栈更新数据的一致性问题。

DTM可适合多语言栈的公司使用。方便go、python、php、nodejs、ruby、c# 各类语言使用。

支持的分布式事务协议包括:SAGA,TCC,XA和二阶段消息这几种模式。

官方网站:https://dtm.pub/

1.启动DTM服务#

参考:https://dtm.pub/guide/install.html#%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%8C%85%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85

项目

1
2
https://github.com/dtm-labs/dtm

git dtm项目

1
2
git clone https://github.com/dtm-labs/dtm && cd dtm

启动dtm

1
2
./dtm

dtm运行后,会监听两个端口

1
2
3
http:36789
grpc:36790

2.分布式事务协议#

1.SAGA模式#

Saga核心思想是将长事务拆分为多个短事务,由Saga事务协调器协调,如果每个短事务都成功提交完成,那么全局事务就正常完成,如果某个步骤失败,则根据相反顺序一次调用补偿操作。

适用场景:适合需要最终一致性的大型跨服务事务,且允许一定时间的临时不一致。

优点:实现简单,不需要锁定资源,性能高。

缺点:数据一致性较弱,可能存在短时间的不一致。

2.TCC模式#

TCC分为3个阶段

  • Try 资源预留阶段:尝试执行,完成所有业务检查(一致性), 预留必须业务资源(准隔离性)
  • Confirm 确认阶段:如果所有分支的Try都成功了,则走到Confirm阶段。Confirm真正执行业务,不作任何业务检查,只使用 Try 阶段预留的业务资源
  • Cancel 取消阶段:如果所有分支的Try有一个失败了,则走到Cancel阶段。Cancel释放 Try 阶段预留的业务资源。

适用场景:适合强一致性要求的场景,例如支付扣款、库存预扣等需要确保每个操作的资源在短时间内完全一致。

优点:可以精细控制资源的锁定和释放,提高一致性。

缺点:实现复杂,需为每个操作编写补偿逻辑。

3.二阶段消息模式#

4.XA模式#

总结#

  • 二阶段消息模式: 适合不需要回滚的场景
  • saga模式: 适合需要回滚的场景
  • tcc事务模式: 适合一致性要求较高的场景
  • xa事务模式: 适合并发要求不高,没有数据库行锁争抢的场景