RocketMQ 也类似

一、消息顺序性的定义与重要性

消息顺序性是指在分布式系统中,确保消息按照生产顺序被消费的能力。在实际业务场景中(如订单状态更新、用户操作日志流转),顺序性错误可能引发严重业务问题(例如用户先收到“发货通知”,后收到“支付成功通知”,导致认知混乱)。

二、Kafka的顺序性保证层次

Kafka 提供三种层次的顺序性保证,可根据业务场景选择:

保证层次 保证范围 实现方式 适用场景 优势/劣势
分区内有序 单个分区内 按 key 分区路由消息 同一用户/订单状态更新等场景 兼顾顺序性与性能,支持并行处理
全局有序 整个 Topic 所有消息 使用单分区 Topic 审计日志等全局时序场景 性能严重受限,无法并行处理
无顺序性 完全不保证顺序 无特殊配置,追求最大吞吐量 非关键业务场景(如日志采集) 吞吐量最高,无顺序保障

推荐方案:优先选择分区内有序,平衡顺序性与性能需求。

三、Producer端顺序性保证

通过配置与自定义分区器,确保消息在生产端的发送顺序。

(一)关键配置

需设置以下四个核心参数:

  1. max.in.flight.requests.per.connection=1:限制每个连接的未确认请求数为 1,避免重试时消息乱序。
  2. enable.idempotence=true:开启幂等性,防止消息重复发送导致的顺序混乱。
  3. acks=all:等待所有副本确认消息写入,确保消息不丢失。
  4. retries=Integer.MAX_VALUE:设置最大重试次数,确保消息发送失败后重试。

(二)自定义分区器实现

通过自定义分区器,将相同业务 ID(如订单 ID)的消息路由到同一分区,核心逻辑: