MST

星途 面试题库

面试题:消息队列RocketMQ如何保证消息的顺序性

在RocketMQ架构下,从生产者发送消息、Broker存储转发到消费者消费消息这一完整链路中,分析RocketMQ是怎样确保消息顺序性的,以及其实现机制的优缺点。
13.0万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试

消息顺序性确保方式

  1. 生产者端
    • 生产者通过选择特定的消息队列(Message Queue)来发送消息,同一个业务逻辑相关的消息发送到同一个队列。RocketMQ 提供了 MessageQueueSelector 接口,生产者可以实现该接口,根据业务标识(如订单号等)计算出要发送到的队列,从而保证相关消息进入同一队列。例如,对于订单相关的消息,按照订单号进行哈希取模运算,映射到特定队列,这样与该订单相关的消息就会按顺序进入同一个队列。
  2. Broker 端
    • Broker 对于每个队列的消息是按顺序存储的。当生产者发送消息到队列后,Broker 会将消息追加到队列尾部,保持消息进入队列的顺序。例如,队列 A 先后收到消息 M1、M2、M3,在 Broker 存储时,M1 在最前,M2 次之,M3 在最后。
    • 当消费者拉取消息时,Broker 也是按顺序从队列中取出消息发送给消费者。
  3. 消费者端
    • 消费者默认是多线程消费,但如果要保证消息顺序性,需要使用顺序消费模式。在顺序消费模式下,消费者会单线程消费同一个队列的消息,确保按照消息进入队列的顺序进行消费。例如,消费者从队列中拉取到消息 M1、M2、M3,会先消费 M1,再消费 M2,最后消费 M3。

实现机制优点

  1. 保证业务一致性:在一些对顺序敏感的业务场景,如订单处理流程(下单、支付、发货等顺序步骤),确保消息顺序性能够保证业务流程的正确性和一致性,避免出现业务混乱。
  2. 实现相对简单:通过在生产者端选择队列,Broker 按队列顺序存储和转发,消费者端单线程消费队列消息,这种机制在设计和实现上相对较为直观和简单,易于理解和维护。
  3. 性能尚可:在局部顺序性要求下(即同一队列内顺序),由于队列之间可以并行处理,在高并发场景下仍能保持较好的性能,适用于很多实际业务场景。

实现机制缺点

  1. 消费性能受限:消费者端为了保证顺序性采用单线程消费队列消息,在高并发情况下,单线程消费速度有限,可能成为性能瓶颈,无法充分利用多核 CPU 的优势,导致整体消费效率较低。
  2. 生产者负载不均:如果生产者按照特定业务标识选择队列,可能会导致某些队列消息堆积严重,而其他队列空闲,造成 Broker 负载不均衡,影响整体系统性能。
  3. 集群扩展性问题:在集群环境下,当需要对 Broker 集群进行扩展时,由于消息已经按照特定规则分布在原有队列中,重新分配队列可能会破坏消息顺序性,需要复杂的迁移和调整策略。