一、MQ实现分布式事务,最简单的原理框架:
借助MQ的消息可靠传递,实现业务间解耦、事务强一致
1、>> 生产者发送消息做可靠性检查,确保消息真正投递出去;
2、>> 消费者做幂等,确保业务没有重复执行;
3、>> 消费者做异常重试,反复出错时需要捕捉异常并记录,以便手工干预;
二、场景实践:
场景
以支付宝转账到余额宝为例,在支付宝已经扣款成功的情况下,余额宝一定收到转账
>> 支付宝和余额宝是两个微服务;
>> 用户用支付宝转1万元到余额宝;
|
具体操作
1、创建队列
>> 创建一个持久化的队列,名称为money;
Durable(持久化保存),Transient(即时保存)。
2、 maven引入
(余额宝和支付宝两个服务都需要)
|
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。
3、 添加配置
(余额宝和支付宝两个服务都需要)
|
4 支付宝端代码编写
向支付宝账号扣款,同时发消息到队列中,通知余额宝账号金额更新
>> 配置MQ发送过程监听
package cn.my.server.clientdemo.zhifu;
import javax.annotation.PostConstruct;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate.ConfirmCallback;
import org.springframework.amqp.rabbit.core.RabbitTemplate.ReturnCallback;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 配置MQ发送过程监听
* @author twotiger-wxm.
* @date 2020-3-3.
*/
@Configuration
public class RabbmitMqConfig {
@Autowired
private RabbitTemplate rabbitTemplate;
@PostConstruct
public void init() {
// 设置发送成功回调
rabbitTemplate.setConfirmCallback(initConfirmCallback());
// 设置发送失败回调
rabbitTemplate.setReturnCallback(initReturnCallback());
}
@Bean
public ReturnCallback initReturnCallback(){
return new FailedListener();
}
@Bean
public ConfirmCallback initConfirmCallback(){
return new SuccessListener();
}
}
|
|
>> 转账接口编写
|
5 余额宝端代码编写
监听支付宝发到消息队列中的消息,做余额宝账号金额更新
|
6 测试
>> 浏览器直接访问 /api/test/mq
>> 控制台结果如下:
|