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