事务消息

数据不一致

在使用消息队列时,如何保证数据一致呢?

先举一个数据不一致的例子,比如生成了一个订单,然后要通知下游服务处理相应的业务,如果此时订单创建成功,但是发送给下游的通知丢失了,就会导致数据不一致。又或者说发送给下游的通知发送成功,但是订单没有成功创建。如何解决呢?可以采用事务消息。

Tips:如果你前面看不懂,可以看后面的例子

什么是事务消息

事务消息通过 两阶段提交(2PC) 和 事务状态回查 机制解决生产者侧的一致性问题。

1. 两阶段提交流程

  • 阶段1:发送预备消息

    • 生产者发送一条 "预备消息" 到消息队列,此消息对消费者不可见。
    • 消息队列持久化该消息并返回确认响应。
  • 阶段2:提交或回滚

    • 提交(Commit) :生产者完成本地事务(如更新数据库),通知消息队列提交预备消息,此时消息对消费者可见。
    • 回滚(Rollback) :若本地事务失败,生产者通知消息队列删除预备消息。

2. 事务状态回查

  • 超时未确认处理:若生产者未在超时时间内提交或回滚,消息队列会主动回查生产者。
  • 业务逻辑回查:生产者需实现回调接口,根据本地事务最终状态(提交或回滚)响应消息队列。

流程图

举个例子

  1. 商家接到订单之后,给配送站发一个"预备消息"
  2. 配送站收到后返回确认信息
  3. 商家开始备餐,备餐完成之后告诉配送站准备好了
  4. 配送站通知骑手

以上是顺利的情况,如果商家备餐期间发送问题,比如备到一半突然有急事(异常),通知配送站,那么配送站将其信息删除,骑手永远也不会知道这个订单;如果商家备餐期间厨房炸了(比如系统崩溃),也有可能太忙了,那么超时后配送站会打电话问商家怎么还没备好,便可知道是要通知还是删除。

相关推荐
j7~2 天前
【仿 RabbitMQ 项目】发布订阅消息队列 (篇八):交换机数据管理模块,分层类设计、SQLite 回调原理与代码实现
服务器·网络·数据库·消息队列·交换机·交换机数据管理·sqlite回调原理
做个文艺程序员4 天前
MQ第04篇:ActiveMQ深度解析:JMS规范、Spring JMS整合与企业级异步通信实战
spring·消息队列·activemq·java-activemq·jms
做个文艺程序员4 天前
MQ第03篇:RabbitMQ进阶实战:Topic路由+死信队列+延迟消息,SaaS订单超时取消完整方案
分布式·消息队列·rabbitmq·死信队列·延迟队列
吴爃5 天前
小微企业 SRE 稳定性建设(四):消息链路与消费积压
中间件·容量规划·消息队列·sre
做个文艺程序员6 天前
MQ第02篇:RabbitMQ快速上手教程:AMQP模型详解+Spring Boot整合实战(附完整代码)
spring boot·消息队列·rabbitmq·java-rabbitmq·amqp
做个文艺程序员7 天前
MinIO第05篇:MinIO事件通知机制与Kafka集成——构建SaaS平台的异步文件处理管道
kafka·消息队列·springboot·minio·事件驱动·异步处理
j7~13 天前
【C++标准项目】C++基于protobuf的发布订阅式消息队列(篇一):项目概述+环境搭建
分布式·消息队列·rabbitmq·gtest·protobuf·muduo·sqlites
醉颜凉16 天前
Kafka 与 RabbitMQ/RocketMQ 选型对比:场景匹配、性能基准与迁移成本
kafka·消息队列·rabbitmq·rocketmq·中间件选型
ShineWinsu17 天前
对于Redis:Redis的认识以及分布式系统的解析
linux·数据库·c++·redis·缓存·消息队列·分布式架构
智码看视界17 天前
技术选型指南:Pulsar vs Kafka:消息队列选型终极对比与压测
kafka·消息队列·pulsar·消息中间件·流处理·高吞吐·架构选型