事务消息(Transactional Message)

事务消息(Transactional Message)是一种高级的消息队列机制,它主要用于解决分布式系统中的数据最终一致性问题

在微服务和分布式架构中,当一个核心业务操作(例如用户下单)需要同时触发多个下游系统(例如库存扣减、积分增加、邮件通知)的变更时,事务消息能够确保核心操作和消息发送是原子性的,从而保证整体业务数据的一致性。


核心问题:分布式系统中的"两难"

在分布式系统中,你不能在一个数据库事务中同时包含本地数据库操作和消息发送操作,因为它们是两个独立的服务。这就会产生一个问题:

场景 风险
先发消息,后执行本地事务 如果消息发出后,本地事务失败并回滚,下游系统已经开始处理消息,导致数据不一致
先执行本地事务,后发消息 如果本地事务成功提交后,发送消息失败(例如网络故障),下游系统永远收不到通知,导致数据不一致

事务消息机制就是为了确保 "本地事务成功,消息必达""本地事务失败,消息必不达"


事务消息的工作原理(以 RocketMQ 为例)

事务消息通常采用一个两阶段提交(Two-Phase Commit)的变种来保障一致性:

阶段一:半事务消息 (Half Message / Prepare)
  1. 生产者发送半消息: 生产者(例如订单系统)将消息发送给消息队列服务器(Broker),但将消息标记为 "半事务消息""预提交" 状态。
  2. 消息不可见: Broker 接收并持久化消息,但不将其投递给消费者
阶段二:执行本地事务
  1. 执行本地事务: 生产者开始执行自己的本地数据库事务。
  2. 提交或回滚判断:
    • 如果本地事务成功提交 (Commit),生产者向 Broker 发送 Commit 指令。
    • 如果本地事务失败回滚 (Rollback),生产者向 Broker 发送 Rollback 指令。
阶段三:消息投递与回查
  1. Broker 处理:
    • 如果收到 Commit 指令,Broker 将半消息标记为 "可投递",此时下游消费者才能收到并处理消息。
    • 如果收到 Rollback 指令,Broker 将丢弃该半消息。
  2. 事务回查 (Transaction Check): 如果生产者在执行本地事务后宕机 ,或者因网络问题未及时发送 Commit/Rollback 指令,Broker 会启动回查机制。Broker 会主动向生产者发起请求,查询该半消息对应的本地事务的真实状态(是已提交、已回滚还是未知),然后根据查询结果来决定是投递还是丢弃消息。

整体流程如下所示:

总结

事务消息是解决数据最终一致性的柔性事务方案中最常用且优雅的方式之一。它牺牲了严格的实时性(最终一致性)来换取更高的系统性能、可用性和吞吐量,特别适用于电商、金融等对数据一致性要求高的场景。

相关推荐
武子康1 天前
Java-197 消息队列应用场景:缓存预热+限流排队+Redis Lua 扣库存+MQ 削峰填谷
java·redis·缓存·性能优化·消息队列·rabbitmq·java-rabbitmq
小马爱打代码2 天前
消息队列:MQ消息幂等 - 从重复根源到防重实战
消息队列
武子康2 天前
Java-195 RabbitMQ BlockingQueue 手搓“消息中间件”雏形:生产者-消费者模型到企业级 MQ 差在哪
java·分布式·架构·消息队列·rabbitmq·java-rabbitmq·mq
GEM的左耳返4 天前
互联网大厂Java求职面试题解析与实战指导:涵盖核心技术栈与业务场景
java·数据库·spring boot·安全·微服务·消息队列·面试题
武子康4 天前
Java-194 RabbitMQ 分布式通信怎么选:SOA/Dubbo、微服务 OpenFeign、同步重试与 MQ 异步可靠性落地
大数据·分布式·微服务·消息队列·rabbitmq·dubbo·异步
better_liang6 天前
每日Java面试场景题知识点之-RabbitMQ
java·消息队列·rabbitmq·面试题·异步通信·企业级开发·系统解耦
腾讯云中间件7 天前
Kafka 集群上云新突破:腾讯云 CKafka 联邦迁移方案
云原生·kafka·消息队列
腾讯云中间件7 天前
腾讯云 RocketMQ 5.x:如何兼容 Remoting 全系列客户端
架构·消息队列·rocketmq
muxin-始终如一7 天前
消息幂等性深度解析与实现方案
开发语言·消息队列·幂等性
Sincerelyplz7 天前
【pulsar】pulsar的定时发送实现原理
后端·消息队列·开源