1. 概述

Kafka 是一款流行的开源分布式消息流中间件,它通过 发布-订阅模式 解耦消息生产者和消费者。Kafka 使用 主题 分发信息,每个主题由不同的分片组成,在 Kafka 术语中称为 分区。分区中的每条消息都有特定的 偏移量

本教程将介绍如何使用 kafka-console-consumer.sh 命令行工具从主题分区的特定偏移量读取消息。示例中使用的 Kafka 版本为 3.7.0。

2. 分区与偏移量简述

Kafka 将写入主题的消息拆分为多个分区

  • 相同 key 的消息会被分配到同一分区
  • 无 key 的消息会被随机发送到某个分区

Kafka 仅保证分区内消息有序,不保证跨分区有序

  • 分区中的每条消息都有唯一 ID
  • 该 ID 称为分区偏移量
  • 新消息追加到分区时,偏移量持续递增

消费者默认从低偏移量向高偏移量读取消息,但有时需要从特定偏移量开始读取。下一节将演示具体实现方法。

3. 实战示例

本节演示如何从特定偏移量读取消息。假设 Kafka 服务已运行,且已使用 kafka-topics.sh 创建了名为 test-topic 的主题,该主题包含三个分区

示例中使用的所有脚本均由 Kafka 提供。

3.1. 写入消息

使用 kafka-console-producer.sh 启动生产者

$ kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test-topic --producer-property partitioner.class=org.apache.kafka.clients.producer.RoundRobinPartitioner
>
  • Kafka 服务监听 localhost:9092--bootstrap-server 指定服务器地址
  • 使用 RoundRobinPartitioner 策略实现轮询写入--producer-property 参数指定)
  • > 符号表示已准备好接收消息

发送六条测试消息:

$ kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test-topic --producer-property partitioner.class=org.apache.kafka.clients.producer.RoundRobinPartitioner
>Message1
>Message2
>Message3
>Message4
>Message5
>Message6
>

轮询分区策略下的消息分布

  • 分区0:Message2, Message5
  • 分区1:Message1, Message4
  • 分区2:Message3, Message6

3.2. 读取消息

使用 kafka-console-consumer.sh 从特定偏移量读取

$ kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --partition 0 --offset 0
Message2
Message5

关键参数说明:

  • --partition 0:指定分区(从0开始编号)
  • --offset 0:指定起始偏移量(从0开始编号)

从分区0偏移量0开始读取,输出符合预期的 Message2 和 Message5。消费者会持续运行等待新消息。

3.2.1. 指定偏移量读取

从分区0偏移量1开始读取:

$ kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --partition 0 --offset 1
Message5 

3.2.2. 限制消息数量

使用 --max-messages 控制读取条数:

$ kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --partition 0 --offset 0 --max-messages 1
Message2
Processed a total of 1 messages
  • --max-messages 1:读取1条消息后退出
  • 未指定该参数时,消费者会持续运行

3.2.3. 读取其他分区

读取分区1和分区2的消息:

$ kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --partition 1 --offset 0 --max-messages 2
Message1
Message4
Processed a total of 2 messages
$ kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --partition 2 --offset 0 --max-messages 2
Message3
Message6
Processed a total of 2 messages

⚠️ 注意事项:若指定的偏移量超过分区现有消息数,消费者会阻塞等待新消息写入。

4. 总结

本文介绍了使用 kafka-console-consumer.sh 从 Kafka 主题分区的特定偏移量读取消息的方法:

  1. 核心概念

    • 分区偏移量是消息的唯一标识
    • 消费者默认从最低偏移量开始顺序读取
  2. 关键参数

    • --partition:指定目标分区
    • --offset:指定起始偏移量
    • --max-messages:控制读取消息数量(可选)
  3. 实际应用

    • 调试特定消息
    • 消费者重置偏移量
    • 数据重放场景

掌握这些参数能更灵活地操作 Kafka 消息流,避免踩坑。


原始标题:How to Read a Message From a Specific Offset in Kafka | Baeldung