沉梦听雨的编程指南 沉梦听雨的编程指南
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)

沉梦听雨

时间是最好的浸渍剂,而沉淀是最好的提纯器🚀
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)
  • API网关

  • RPC

  • 消息队列

    • 内存

    • Redis

    • RocketMQ

    • Kafka

      • Kafka基础小结
      • Kafka的下载安装以及使用
      • SpringBoot使用Kafka示例
      • SpringCloud使用Kafka
      • Kafka实现延迟消息
      • 消息堆积处理方案
      • Kafka实现顺序消费
        • Kafka 默认的顺序保证机制
        • Kafka 实现顺序消费的关键条件
          • 1. 同一类消息进入同一个 Partition(关键)
          • 2. 消费端设置为单线程消费 Partition(串行)
          • 3. 分区数 = 消费线程数(或 = 消费实例数)
        • 典型顺序消费场景
        • 顺序消费的 Kafka 设计实践
          • Producer 端
          • Consumer 端
        • 常见错误 & 顺序失效点
        • 总结
  • Spring Cloud

  • 分布式事务

  • 云存储

  • 搜索引擎

  • 多媒体框架

  • 虚拟机

  • 微服务
  • 消息队列
  • Kafka
沉梦听雨
2025-06-26
目录

Kafka实现顺序消费

# Kafka 实现顺序消费

# Kafka 默认的顺序保证机制

Kafka 默认只能保证:

  • 在同一个 Partition 中,消息是按照生产顺序被消费的(即 单 Partition 顺序)。

示例说明:

  • 如果 Topic 有多个 Partition,Kafka 会将消息打散到不同 Partition,消费时多个线程并发拉取,无法保证整体顺序。
  • 若你对顺序有要求,必须:
    • 让同一类消息始终进入同一个 Partition
    • 一个 Partition 内串行消费

# Kafka 实现顺序消费的关键条件

# 1. 同一类消息进入同一个 Partition(关键)

  • Kafka 分区是按照 key 进行 hash 分配的
  • 所以只要 key 相同,Kafka 就会将消息写入同一个 Partition,从而保证顺序性。
producer.send(new ProducerRecord<>("topic", "sameKey", value));
1

# 2. 消费端设置为单线程消费 Partition(串行)

  • Kafka 每个 Partition 默认只能被一个 Consumer 实例线程消费。
  • 若你使用线程池或并发处理 Partition 消息,要确保消费同一个 Partition 的线程是单一的。

# 3. 分区数 = 消费线程数(或 = 消费实例数)

  • 如果你有顺序消费的需求,不能启用多个消费者消费同一个 Partition,否则顺序就被打破。

# 典型顺序消费场景

场景 说明
订单状态流转 下单 → 支付 → 发货 → 收货,必须顺序处理
财务入账流水 金额变更必须按时间严格入账
用户行为日志 记录顺序操作行为用于分析

# 顺序消费的 Kafka 设计实践

# Producer 端

  • 使用相同 key 保证同类消息写入同一 Partition:
// 订单 ID 作为 key
producer.send(new ProducerRecord<>("order_topic", orderId, orderEvent));
1
2

# Consumer 端

  • 保证 Partition 消费是单线程串行处理,例如:
// 使用 Kafka 原生 Consumer,按 Partition 消费
for (ConsumerRecord<String, String> record : records.partitions()) {
    // 按 partition 拆分,再逐条处理
}
1
2
3
4
  • 或使用 Spring Kafka 设置并发数匹配分区数:
spring.kafka.listener.concurrency: 3  # 设置并发数,必须与 partition 数量一致
1

# 常见错误 & 顺序失效点

错误点 后果
同类消息 key 不一致 会打散到多个 Partition,顺序错乱
Partition 被多个线程消费 并发处理导致乱序
自动负载均衡导致 rebalance Consumer Group rebalance 时可能打乱顺序
异步处理消息逻辑 异步操作返回无序

# 总结

Kafka 默认支持Partition 内的顺序性。要实现顺序消费,需要将相同业务标识的消息(如订单号)投递到同一个 Partition,并且确保消费端对 Partition 的消息是单线程串行处理的。

上次更新: 2025/7/1 09:31:37
消息堆积处理方案
基础知识篇

← 消息堆积处理方案 基础知识篇→

Theme by Vdoing | Copyright © 2023-2025 沉梦听雨 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式