京东二面:如何利用RocketMQ事务消息,来实现分布式事务?比如下单清空购物车的场景

云计算 分布式
分布式事务是指在多个独立的系统或数据库之间执行的事务操作,它确保所有参与者要么全部成功提交,要么全部回滚,以维持数据一致性。

前言

大家好,我是田螺。

分享一道京东的场景面试题:如何利用RocketMQ事务消息实现分布式事务?比如下单清空购物车场景。

我们如何更好回答这个问题呢?可以按照以下这几个维度:

  • 什么是分布式事务?
  • 一条普通消息,从产生到消费历程
  • 消息队列的事务消息流程
  • 事务消息的下单清空购物车场景

1. 什么是分布式事务

分布式事务是指在多个独立的系统或数据库之间执行的事务操作,它确保所有参与者要么全部成功提交,要么全部回滚,以维持数据一致性。

通常保证分布式事务的方案有:消息队列的事务消息、TCC(Try-Confirm-Cancel)模式、Seata、二阶段提交等。

2.一条消息从产生到消费历程

我们先来看看:RocketMQ的一条普通的消息,从产生到被消费,经历的流程:

图片图片

  • 生产者产生消息,发送到MQ服务器(Broker)
  • MQ服务器收到消息后,将消息持久化到存储系统。
  • MQ服务器返回ACk到生产者。
  • 消费者从MQ服务器(Broker)拉取消息(Pull或Push,可以配置的)
  • 消费者消费完消息,响应ACK
  • MQ服务器收到ACK,认为消息消费成功,即在存储中删除消息。

其实,在RocketMQ中,消费完消息后,消息不会立即被删除,而是根据消息的过期时间和消费进度进行管理。消费者确认消费后,RocketMQ会记录该消息的消费状态,并在达到设定的过期时间后,从存储中删除该消息。这种机制确保了消息的可靠性和持久性。

3. 消息队列的事务消息流程

在开始之前,我们先来了解一下,什么是半消息?

这个半消息,它不是说消息内容不完整,它包含的内容就是完整的消息内容。它跟普通消息的唯一区别是,在事务提交之前,对于消费者来说,这个消息是不可见的。

图片图片

  1. 生产者产生消息,发送一条半消息到MQ服务器。
  2. MQ收到消息后,将消息持久化到存储系统,这条消息的状态是待发送状态。
  3. MQ服务器返回ACK确认到生产者。
  4. 生产者执行本地事务
  5. 如果本地事务执行成功,即commit执行结果到MQ服务器;如果执行失败,发送rollback。
  6. 如果是正常的commit,MQ服务器更新消息状态为可发送;如果是rollback,即删除消息。
  7. 如果消息状态更新为可发送,则MQ服务器会push消息(可配置push还是pull)给消费者。消费者消费完就回ACK。
  8. 如果MQ服务器长时间没有收到生产者的commit或者rollback,它会反查生产者,然后根据查询到的结果执行最终状态。

4. 事务消息下的单清空购物车场景

我们看下,下订单清空购物车的例子吧。订单系统创建完订单后,然后发消息给下游系统的购物车系统,清空购物车。

  1. 生产者(订单系统)产生消息,发送一条半消息到MQ服务器
  2. MQ收到消息后,将消息持久化到存储系统,这条消息的状态是待发送状态。
  3. MQ服务器返回ACK确认到生产者,此时MQ不会触发消息推送事件
  4. 生产者执行本地事务(订单创建成功,提交事务消息)
  5. 如果本地事务执行成功,即commit执行结果到MQ服务器;如果执行失败,发送rollback。
  6. 如果是commit正常提交,MQ服务器更新消息状态为可发送;如果是rollback,即删除消息。
  7. 如果消息状态更新为可发送,则MQ服务器会push消息给消费者(购物车系统)。消费者消费完(即拿到订单消息,清空购物车成功)就应答ACK。
  8. 如果MQ服务器长时间没有收到生产者的commit或者rollback,它会反查生产者,然后根据查询到的结果(回滚操作或者重新发送消息)执行最终状态。

有些伙伴可能有疑惑,如果消费者消费失败怎么办呢?那数据是不是不一致啦?所以就需要消费者消费成功,执行业务逻辑成功,再反馈ack嘛。如果消费者消费失败,那就自动重试嘛,接口支持幂等即可。

责任编辑:武晓燕 来源: 捡田螺的小男孩
相关推荐

2024-06-13 09:25:14

2024-01-26 13:17:00

rollbackMQ订单系统

2022-06-27 08:21:05

Seata分布式事务微服务

2023-12-26 08:59:52

分布式场景事务机制

2022-08-26 00:02:03

RocketMQ单体架构MQ

2022-06-21 08:27:22

Seata分布式事务

2022-09-13 16:01:13

购物车京东接口

2017-07-26 15:08:05

大数据分布式事务

2024-06-07 08:06:36

2020-03-31 08:05:23

分布式开发技术

2021-12-15 10:00:21

分布式事务框架

2024-10-29 08:34:27

RocketMQ消息类型事务消息

2022-06-14 10:47:00

分布式事务数据

2009-06-19 15:28:31

JDBC分布式事务

2021-09-29 09:07:37

分布式架构系统

2009-09-18 15:10:13

分布式事务LINQ TO SQL

2020-04-28 12:18:08

Seata模式分布式

2019-12-27 16:00:56

分布式事务框架Java

2018-05-28 09:53:12

京东购物车Java

2023-01-06 09:19:12

Seata分布式事务
点赞
收藏

51CTO技术栈公众号