分布式事务解决方案之可靠消息最终一致性(五)
此方案利用消息中间件完成,事务发起方(生产者)将消息发给中间件,事务参与方(消费者)从消息中间件中获取消息。事务发起方与中间件,事务参与方与中间件之间都是由网络连接的,由于网络的不确定性,引起了分布式事务" title="分布式事务">分布式事务问题。
因此,消息可靠最终一致性方案需要解决如下问题:
- 本地事务与消息发送的原子性问题:即只要本地事务执行完成,消息到达中间件有一定要完成。
- 事务参与方接受消息可靠性:事务参与者可以从消息对列中接受到消息,如果接收失败,可以重复接收消息。
- 信息重复消费问题:消费节点超时会引起信息重复投递,可能会导致消息重复消费。需要实现事务参与方的幂等性。
解决方案
本地消息表方案
最初由eBay提出该方案,该方案的核心是通过本地事务的方式,保证数据业务操作和消息的一致性,然后通过定时任务将消息发送至消息中间件,待确认消息发送给消费方后再删除表中消息。
交互流程:
- 注册用户与存储积分消息作为本地事务进行处理。
- 定时任务触发扫描对应积分消息表。
- 消费消息,使用MQ的ack机制,消费者监听MQ,如果消费者接收到消息并且业务处理完成后,想MQ发送ack,此时说明消费者正常消费消息完成,MQ不再向消费者推送消息。由于消息会重复投递,积分服务需要实现功能幂等性。
RocketMQ事务消息方案
RocketMQ事务消息设计则主要是为了解决生产者端消息发送与本地事务的原子性问题,RocketMQ的设计中,broker与producer端的双向通信能力,使得broker天生可以作为一个事务协调者。其存储机制为事务消息提供持久化的能力,其高可用机制以及可靠消息设计原则为其在异常发生时能报保证达成事务的最终一致性。
RocketMQ4.3之后实现了完成的事务消息,实际上是将本地消息表封装至了MQ内部,解决Producer端消息发送与本地事务执行的原子性问题。
执行流程如下(以上述注册送积分为例):
- Producer发送消息:Producer发送事务消息给MQ,MQ将消息标记为Prepared(预备状态),注意此时该消息是无法被订阅方消费的。
- MQ回应给Producer消息发送方已收到消息。
- Producer消息发送方执行本地事务。
- 消息投递:Producer消息发送方本地事务执行完成后,自动向MQ发送commit消息,MQ则将1中消息的状态修改为“可消费”状态,此时MQ的订阅方可以消费该消息。若本地事务执行失败,MQ接受到rollback消息,则MQ将该消息删除。
- 事务回查:如果Producer消息发送方执行本地事务前挂掉或者超时,MQ会通过事务回查功能询问Producer执行本地事务的状态。
小结:
可靠消息最终一致性就是保证消息从生产方经消息中间件传递到消费方的一致性。使用rocketMQ解决了两个问题:
- 本地事务与消息发送的原子性问题
- 事务参与方接收消息的可靠性
可靠消息最终一致性事务适合执行周期长且实时性要求不高的场景。引入消息机制后,同步事务操作变为基于消息执行的异步操作,避免了分布式事务中同步阻塞操作的影响,并实现了服务的解耦。
以上是 分布式事务解决方案之可靠消息最终一致性(五) 的全部内容, 来源链接: utcz.com/z/516073.html