rabbitmq mysql事务_RabbitMq解决分布式事物

一、RabbitMQ解决分布式事务思路:

案例: 经典案例,以目前流行点外卖的案例,用户下单后,调用订单服务,让后订单服务调用派单系统通知送外卖人员送单,这时候订单系统与派单系统采用MQ异步通讯。

二、RabbitMQ解决分布式事务原理:采用最终一致性原理。

需要保证以下三要素

1、确认生产者一定要将数据投递到MQ服务器中(采用MQ消息确认机制)

2、MQ消费者消息能够正确消费消息,采用手动ACK模式(注意重试幂等性问题)

3、如何保证第一个事务先执行,采用补偿机制,在创建一个补单消费者进行监听,如果订单没有创建成功,进行补单。

三、如果生产者投递消息到MQ服务器成功

场景1:如果消费者消费消息失败了,生产者是不需要回滚事务的。

解决方案:消费者采用手动ack应答模式,采用MQ进行补偿重试机制,注意MQ补偿幂等性问题。

问题:如何确保生产者投递消息到MQ服务器一定能成功?

解决方案:confirm机制(确认应答机制)。

场景2 如果生产者投递消息到MQ服务器失败,如何解决?

解决方案:使用生产者重试机制进行发消息,注意幂等性问题。

场景3  如何保证一个事务先执行,生产者投递消息到MQ服务器成功,消费者消费成功了,但是订单却回滚了。

解决方案:补单机制。

传统解决方式:

858fddbd7af39c56bdfbc84fc3c75239.png

RabbitMq解决方案:

MQ解决分布式事务一致性

案例中 订单表 和 派单表必须一致!

用MQ 可以做流量削峰值

MQ解决分布式事务最终一致性思想

1.   确保生产者消息 一定要投递到MQ服务器端成功

bc40d519d65ba4896c4d5f2bdaec411b.png

如果生产者投递消息到MQ服务器成功

场景1  如果消费者消费消息失败了

生产者是不需要回滚事务。 消费者采用手动ack应答方式  进行补偿机制,补偿的过程中注意 幂等性 问题。

分布式事务中遵循base理论 遵循cpa理论

如何确保生产者发送消息一定发送到MQ消息服务器端成功? confirm机制 确认应答机制

场景2    如果生产者发送消息到MQ服务器端失败

使用生产者重试机制进行发消息

四、代码实现

1、派单表

create TABLE platoon(

id INT PRIMARY KEY AUTO_INCREMENT,

orderId VARCHAR(255),

takeout_userIdint)

2、订单表

create TABLE order_info(

id INT PRIMARY KEY AUTO_INCREMENT,

name VARCHAR(30),

order_money INT,

orderId VARCHAR(255)

);

3、生产者

1.实现接口 implements RabbitTemplate.ConfirmCallback

2. 重写回调方法   成功 失败的  调用

@Override

public void confirm(CorrelationData correlationData, boolean ack, String cause) {

send方法里面调用回调函数:

this.rabbitTemplate.setMandatory(true);

this.rabbitTemplate.setConfirmCallback(this);

yml需要配置回调机制:

###开启消息确认机制 confirms

publisher-confirms: true

publisher-returns: true

重试也是有一定次数限制的 如果超过一定次数 就需要进行人工补偿了

上面已经实现了确保消息发送给 消费者   此时的数据不一致问题 就是:

场景3.  如何保证第一个事务先执行,生产者投递消息到MQ服务器成功,消费者消费消息成功了,但是订单事务回滚了。

(生产者投递消息给消费者消费成功 然后 生产者回滚了)

MQ解决分布式原理通过最终一致性解决总体框架图:  交换机采用路由键模式  补单队列和派但队列都绑定同一个路由键

e5aa43bdb4a593e1216d5c851f5caa8a.png

支付服务和积分服务

bdc92ddd222d9b09728fbc21baae4b58.png

下单

333b096b8f2c7cc3b7d612f174f86e4e.png

pom文件<

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值