前言:
本文主要介绍关于MQ使用过程中,通过场景分析为什么要使用事务控制,以及事务如何实现。
场景分析
为什么我们在使用MQ的时候需要考虑结合事务?
试想一下,我们平时使用Mq发送消息的通用场景是不是
- 生产者和MQ集群建立连接,并发送消息。
- 消费者消费消息。
- 生产者发送完信息更改数据库状态。
我们讨论的事务是指生产者从数据库查询信息,发送消息后,更改数据库状态。
此时没有事务可能会出现的问题场景:
- 当消息发送时间过长,占用数据库连接。
- 当消息成功发送出去,但是更改数据库状态失败,并进行回滚。
- 当生产者逻辑复杂,消费已经消费完消息了,数据库的状态还未更改。
事务使用及问题解决
首先第一个问题 ,是数据库操作和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。