事务提交后发送MQ消息

前言:

本文主要介绍关于MQ使用过程中,通过场景分析为什么要使用事务控制,以及事务如何实现。

场景分析

为什么我们在使用MQ的时候需要考虑结合事务?

试想一下,我们平时使用Mq发送消息的通用场景是不是

  1. 生产者和MQ集群建立连接,并发送消息。
  2. 消费者消费消息。
  3. 生产者发送完信息更改数据库状态。

我们讨论的事务是指生产者从数据库查询信息,发送消息后,更改数据库状态。

此时没有事务可能会出现的问题场景:

  • 当消息发送时间过长,占用数据库连接。
  • 当消息成功发送出去,但是更改数据库状态失败,并进行回滚。
  • 当生产者逻辑复杂,消费已经消费完消息了,数据库的状态还未更改。

事务使用及问题解决 

首先第一个问题 ,是数据库操作和MQ消费发送耦合的问题,我们需要将两个操作解耦

第二,三个问题,我们只需要使用事务控制,只有当数据库的状态被正确更改后才能去发送消息。这样才能确保整个链路的数据一致性以及消息的时延性。

接下来我们就来探讨如何去使用事务控制。 可以利用 TransactionSynchronization#afterCommit 的这个方法,当数据成功保存到数据库并且事务提交了就把消息发送到 MQ 里面。

@Transactional
public void finishOrder(Order order){
	// 修改订单成功
	updateOrderSuccess(order);

	// 发送消息到 MQ
    TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){
       @Override
       public void afterCommit() {
           mqService.send(order);
       }
    });
}

当事务成功提交之后,就会把消息发送给 MQ。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值