当前位置: 首页 > 图灵资讯 > java面试题> 分布式事务有哪些常见的实现方案?-本地消息表

分布式事务有哪些常见的实现方案?-本地消息表

来源:图灵教育
时间:2024-04-12 13:39:06
 

本地消息表:

1、什么是本地消息表:

本地消息表的核心思路就是将分布式事务拆分成本地事务进行处理,在该方案中主要有两种角色:事务主动方和事务被动方。事务主动发起方需要额外新建事务消息表,并在本地事务中完成业务处理和记录事务消息,并轮询事务消息表的数据发送事务消息,事务被动方基于消息中间件消费事务消息表中的事务。

这样可以避免以下两种情况导致的数据不一致性:

  • 业务处理成功、事务消息发送失败
  • 业务处理失败、事务消息发送成功

2、本地消息表的执行流程:

  • ① 事务主动方在同一个本地事务中处理业务和写消息表操作
  • ② 事务主动方通过消息中间件,通知事务被动方处理事务消息。消息中间件可以基于 Kafka、RocketMQ 消息队列,事务主动方主动写消息到消息队列,事务消费方消费并处理消息队列中的消息。
  • ③ 事务被动方通过消息中间件,通知事务主动方事务已处理的消息。
  • ④ 事务主动方接收中间件的消息,更新消息表的状态为已处理。

一些必要的容错处理如下:

  • 当①处理出错,由于还在事务主动方的本地事务中,直接回滚即可
  • 当②、③处理出错,由于事务主动方本地保存了消息,只需要轮询消息重新通过消息中间件发送,通知事务被动方重新读取消息处理业务即可。
  • 如果是业务上处理失败,事务被动方可以发消息给事务主动方回滚事务
  • 如果事务被动方已经消费了消息,事务主动方需要回滚事务的话,需要发消息通知事务主动方进行回滚事务。

3、本地消息表的优缺点:

(1)优点:

  • 从应用设计开发的角度实现了消息数据的可靠性,消息数据的可靠性不依赖于消息中间件,弱化了对 MQ 中间件特性的依赖。
  • 方案轻量,容易实现。

(2)缺点:

  • 与具体的业务场景绑定,耦合性强,不可公用
  • 消息数据与业务数据同库,占用业务系统资源
  • 业务系统在使用关系型数据库的情况下,消息服务性能会受到关系型数据库并发性能的局限