微服务事务SAGA

  • Saga (消息驱动的本地事务序列)

分布式事务的问题

  • 许多NoSQL不支持XA标准
  • 会降低可用性

使用SAGA维护一致性

使用SAGA完成一个跨服务的订单创建:

屏幕截图 2021-01-21 111838

这意味着每一步所产生的子事务都会被写入数据库,必须通过补偿事务的方式来进行回滚。同时也意味着这样的事务缺少隔离性。

协作模式

saga参与方如何进行协调:

协同式

事务的决策和执行逻辑分布在每个参与方中

屏幕截图 2021-01-21 112848

编排式

决策和执行逻辑集中在编排器类,由该中心指挥各个参与方

屏幕截图 2021-01-21 141422

为避免编排器类含有过多的业务逻辑,可通过设计只负责排序的编排器解决这个问题。

实现隔离

saga包含三种事务类型:

  • 可补偿事务
  • 关键性事务:执行成功,则saga将一直运行到完成
  • 可重复事务

对策

  • 语义锁:通过对数据设置一个PENDING状态避免其他事务修改
  • 交换式更新:类似于git版本管理,使用新增数据的方式撤销更新
  • 悲观视图:对事务操作重排序,以降低脏读导致的风险
  • 重读值:通过重读验证数据未被修改
  • 版本文件:通过记录对数据执行的操作,以将不可交换的操作转换为可交换操作
  • 业务风险评级:只在低风险业务应用saga

results matching " "

No results matching " "

results matching " "

No results matching " "