在实际业务中, 经常有如下场景
更新一条数据后, 需要发送一条消息异步通知其他服务进行后续处理
比如用户完成激活, 发送一条消息通知第三方服务同步用户状态
那么会有如下代码
@Transactional
public void enabled() {
//更新用户状态
updateUser();
//发送消息
sendMsg();
}
复制代码
这样写可能出现这样的问题
事务提交失败, 消息发送成功
那换种方式写
将sendMsg();
放在事务外面, 等事务提交成功之后才发送消息
这样也会有问题, 事务提交成功, 但消息发送失败
这两种情况都会导致业务数据出现异常
使用RocketMQ的事务消息就可以解决这个问题.
首先我们在@Transactional
中发送一个半消息
, 这个半消息此时是不能被消费的.
然后数据库事务结束之后, 再确认数据库事务状态, 确认执行成功了再向RocketMQ发送确认
消息, 此时的消息才能算完全体, 可以被Consumer进行消费. 且Broker会定时扫描长时间没有进行二次确认的消息, 主动向Producer进行消息回查.
实现最终一致性
若有谬误, 请评论指出
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END