本地消息表
本地消息表是一种解决分布式事务问题的方案。它通过在业务数据库中建立一张消息表,用来存储需要发送给消息中间件的消息。业务操作和插入消息表的操作在同一个本地事务中,从而保证了数据业务操作和消息的一致性。然后通过定时任务将消息发送至消息中间件,待确认消息发送给消费方成功再将消息删除。
说明:为什么不直接使用MQ发送消息,而是先把消息保存到数据库,那是因为发送消息这个操作和本地数据库操作,不能确保每次都能成功,数据库事务管不到发送消息这个操作,有可能出现数据库保存数据成功,但是发送消息失败。
提示:本地消息表的核心,就是利用本地数据库事务,确保本地业务操作和消息数据,通过数据库事务,保存到数据库中,然后再通过定时补偿机制,把存储在数据库中的消息处理掉。
示意图
下图(UML时序图)是注册加积分,使用本地消息表解决分布式事务的例子。
说明:
- 在上图中积分消息日志表,就是本地消息表。
本地消息表优缺点
优点:
- 实现逻辑简单,开发成本比较低。
缺点:
- 与业务场景绑定,高耦合,不通用。
- 本地消息表与业务数据表在同一个库,占用业务系统资源,量大可能会影响数据库性能。
本地消息表替代方案
在以前很多MQ中间件是不支持事务消息,所以需要借助本地消息表方案确保消息的可靠性,目前RocketMQ这类消息中间,本身就支持事务消息,可以取代本地消息表方案,如果你的项目使用的MQ不支持事务消息,可以考虑本地消息表方案。