RocketMQ解决消息发送与业务落库的一致性

在实际业务中, 经常有如下场景

更新一条数据后, 需要发送一条消息异步通知其他服务进行后续处理

比如用户完成激活, 发送一条消息通知第三方服务同步用户状态

那么会有如下代码

@Transactional
public void enabled() {
	//更新用户状态
    updateUser();
    //发送消息
    sendMsg();
}
复制代码

这样写可能出现这样的问题

事务提交失败, 消息发送成功

那换种方式写

sendMsg();放在事务外面, 等事务提交成功之后才发送消息

这样也会有问题, 事务提交成功, 但消息发送失败

这两种情况都会导致业务数据出现异常

使用RocketMQ的事务消息就可以解决这个问题.

首先我们在@Transactional中发送一个半消息, 这个半消息此时是不能被消费的.

然后数据库事务结束之后, 再确认数据库事务状态, 确认执行成功了再向RocketMQ发送确认消息, 此时的消息才能算完全体, 可以被Consumer进行消费. 且Broker会定时扫描长时间没有进行二次确认的消息, 主动向Producer进行消息回查.

实现最终一致性

若有谬误, 请评论指出

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享