常用的分布式事务解决方案
- 消息发送一致性(可靠消息的前提保障);
- 消息一致性的异常处理流程;
- 常规MQ队列消息的处理流程和特点;
- 消息重复发送问题及业务接口的幂等性设计;
- 消息子系统消息确认;
消息一致性方案
- 本地消息服务设计;
- 独立消息服务设计;
本地消息服务设计:
考虑将一个分布式事务拆分为两个独立的自事务,每个子事务都有一张本地消息表。
先记录本地消息,调用远程接口,操作本地消息表修改状态。这个过程不涉及分布式操作。
消息最终一致性方案
建立定时服务对比创建表及结果表,进行补偿操作。
采用消息中间件
当采用消息中间件时,消息的可靠性体现在两个方面:
- 消息的发送者端 (生产者):发送者端完成操作后一定能将消息成功发送到消息系统
- 消息的接收者端(消费者):消费者端仅且能够从消息系统成功消费一次消息。
采用支持事务的消息中间件
阿里巴巴的RocketMQ中间件就支持一种事务消息机制,能够确保本地操作和发送消息达到本地事务一样的效果:
- 第一阶段,RocketMQ在执行本地事务之前,会先发送一个Prepared消息,并且会持有这个消息的地址
- 第二阶段,执行本地事物操作
- 第三阶段,确认消息发送,通过第一阶段拿到的地址去访问消息,并修改状态,如果本地事务成功,则修改状态为已提交,否则修改状态为已回滚
保证消费者不重复消费消息:
- 消费端处理消息的业务逻辑保持幂等性;
- 保存消费者消费的状态即保证每条消息都有唯一编号,并且保证消息处理成功后一定能写入到一张去重日志表;
RocketMQ、Kafka都不保证消息不重复,如果你的业务需要保证严格的不重复消息,那么就需要在我们的业务端保存消费状态,进行去重。
解决消费者消费失败:
解决消费失败:报警系统+人工处理