分布式事务
概述
在微服务架构中,当我们需要跨服务保证数据一致性时,原先的数据库事务力不从心,无法将跨库、跨服务的多个操作放在一个事务中。这样的应用场景非常多,我们可以列举出很多:
- 订单系统:需要保证创建订单和扣减库存要么同时成功,要么同时回滚
- 跨行转账场景:数据不在一个数据库,但需要保证余额扣减和余额增加要么同时成功,要么同时失败
- 积分兑换场景:需要保证积分扣减和权益增加同时成功,或者同时失败
- 出行订票场景:需要在第三方系统同时定几张票,要么同时成功,要么全部取消
面对这些本地事务无法解决的场景,我们需要分布式事务的解决方案,保证跨服务、跨数据库更新数据的一致性。
解决方案
go-zero 与dtm强强联合,推出了在 go-zero 中无缝接入 dtm 的极简方案,是 go 生态中首家提供分布式事务能力的微服务框架。该方案具备以下特征:
- dtm 服务可以通过配置,直接注册到 go-zero 的注册中心
- go-zero 能够以内建的 target 格式访问 dtm 服务器
- dtm 能够识别 go-zero 的 target 格式,动态访问 go-zero 中的服务
详细的接入方式,参见 dtm 文档:go-zero 支持
更多应用场景
dtm 不仅可以解决上述的分布式事务场景,还可以解决更多的与数据一致性相关的场景,包括:
- 数据库与缓存一致性: dtm 的二阶段消息,能够保证数据库更新操作,和缓存更新/删除操作的原子性
- 秒杀系统: dtm 能够保证秒杀场景下,创建的订单量与库存扣减数量完全一样,无需后续的人工校准
- 多种存储组合: dtm 已支持数据库、Redis、Mongo 等多种存储,可以将它们组合为一个全局事务,保证数据的一致性
更多 dtm 的能力和介绍,参见dtm