一架梯子,一头程序猿,仰望星空!
分布式事务面试题 > 内容正文

什么是本地消息表?如何用它实现分布式事务?


问题简答

本地消息表是一种解决分布式事务问题的方案。这个方案最初是 eBay提出的,它通常用于解决分布式事务中的消息可靠性问题。在基于消息的分布式事务方案中,如何确保本地数据库事务和消息事务的一致性,都能正确执行,基于本地消息表可以确保消息被正确处理掉。

问题详解:

本地消息表

本地消息表是一种解决分布式事务问题的方案。它通过在业务数据库中建立一张消息表,用来存储需要发送给消息中间件的消息。业务操作和插入消息表的操作在同一个本地事务中,从而保证了数据业务操作和消息的一致性。然后通过定时任务将消息发送至消息中间件,待确认消息发送给消费方成功再将消息删除。

说明:为什么不直接使用MQ发送消息,而是先把消息保存到数据库,那是因为发送消息这个操作和本地数据库操作,不能确保每次都能成功,数据库事务管不到发送消息这个操作,有可能出现数据库保存数据成功,但是发送消息失败。

提示:本地消息表的核心,就是利用本地数据库事务,确保本地业务操作和消息数据,通过数据库事务,保存到数据库中,然后再通过定时补偿机制,把存储在数据库中的消息处理掉。

示意图

下图(UML时序图)是注册加积分,使用本地消息表解决分布式事务的例子。

说明:

  • 在上图中积分消息日志表,就是本地消息表。

本地消息表优缺点

优点:

  • 实现逻辑简单,开发成本比较低。

缺点:

  • 与业务场景绑定,高耦合,不通用。
  • 本地消息表与业务数据表在同一个库,占用业务系统资源,量大可能会影响数据库性能。

本地消息表替代方案

在以前很多MQ中间件是不支持事务消息,所以需要借助本地消息表方案确保消息的可靠性,目前RocketMQ这类消息中间,本身就支持事务消息,可以取代本地消息表方案,如果你的项目使用的MQ不支持事务消息,可以考虑本地消息表方案。