关于利用RocketMQ,优化项目种现存的微信支付回调及未付款订单超时处理

本文介绍了如何使用RocketMQ优化微信支付回调和未付款订单超时处理,以降低代码耦合度和提高系统稳定性。 RocketMQ的事务消息特性用于确保消息不丢失,同时提供2主2从的集群部署策略保证数据安全性。项目采用2主2从异步刷盘,同步复制来防止消息丢失,并利用事务消息防止消息丢失,确保业务流程的原子性。
摘要由CSDN通过智能技术生成


背景及选取原因

背景:

现有的芊益医生的微信回调为我之前利用JUC定时线程池来解决的,存在代码耦合度高,线程池如果挂了的一些列可能。

所以决定采用RocketMQ进行解耦
在这里插入图片描述

利用独有的事务消息特性,进行回调处理,超时取消

同时为以后的业务做扩展,如加入积分业务,扣减库存,等下游服务均可用MQ进行解耦

选取原因:

rabbitMQ底层为elang语言,适合并发量吞吐量比较小的场景,不具备rocketMQ的事务消息机制。
rocketMQ为阿里巴巴开发的一款高可用高吞吐量的消息框架,但是它的开源版是不支持定制延迟级别的,云上版本支持。

在这里插入图片描述

当然引入MQ会存在系统架构上的复杂程度增加,
所以暂时只考虑在支付后的回调,以及未支付订单的超时取消场景进行应用

一、2主2从异步刷盘,同步复制

为防止MQ队列崩溃引起的消息丢失等原因,可以采用2主2从同步刷盘的集群部署
采用rocketmq-console-ng进行控制台查看,这样即使有MQ节点挂了,并不影响运行,同时消息会同步刷盘,确保不丢失

在这里插入图片描述

二、使用事务消息防止消息的丢失

这个事务消息是RocketMQ提供的一个非常有特色的功能

事务消息只保证消息发送者的本地事务与发消息这两个操作的原子性,因此,事务消息的示例只涉及到消息发送者,对于消息消费者来说,并没有什么特别的。

为了避免单个消息被检查太多次而导致半队列消息累积,我们默认将单个消息的检查次数限制为 15 次,但是用户可以通过 Broker 配置文件的 transactionCheckMax参数来修改此限制。

在这里插入图片描述

项目结构如图:
在这里插入图片描述

关键代码如下:

/**
 * @description: 事务消息监听器
**/
@Slf4j
@Component
@RocketMQTransactionListener(rocketMQTemplateBeanName = "rocketMQTemplate")
public class OrderTransactionImpl implements RocketMQLocalTransactionListener {
   
    private final int CHECK_NUMS=15;
    private AtomicInteger wz03Index = new AtomicInteger(1);
    private AtomicInteger wz24Index = new AtomicInteger(1);
    @Value("${mqUrl.xszfUrl}")
    private String xszfUrl;
    @Autowired
    R01UFDOCIllnessOrderRepo wz03Repo;
    @Autowired
    GetMsgResultService getMsgResultService;
    @Autowired
    R01UFRentTxOrderRepo wz24Repo;
    private ConcurrentHashMap<Object, Message> localTrans = new ConcurrentHashMap<>();
    @Autowired
    RedisTemplate redisTemplate;
    @Override
    public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
   
        Object transId = msg.getHeaders().get(RocketMQHeaders.PREFIX+RocketMQHeaders.TRANSACTION_ID);
        String wwz311 = new String((byte[]) msg.getPayload());
        localTrans.put
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值