第 5 / 19 篇

第 4 章 发出和读到第一条消息

创建单分区主题

在新的终端,进入 Kafka 解压目录,执行:

bin/kafka-topics.sh --bootstrap-server localhost:9092 \
  --create --topic hello-kafka \
  --partitions 1 --replication-factor 1

预期看到 Created topic hello-kafka.。若提示已经存在,可以继续使用;本章的消息数预期以第一次创建的空主题为准。

查看它:

bin/kafka-topics.sh --bootstrap-server localhost:9092 \
  --describe --topic hello-kafka

重点找 PartitionCount: 1 和 ReplicationFactor: 1。Leader、Replicas、Isr 后面的数字是节点编号,不是消息数量。

写入三行

bin/kafka-console-producer.sh --bootstrap-server localhost:9092 \
  --topic hello-kafka

进入交互界面后,输入下面三行,每行后回车:

你好,Kafka
这是第二条消息
订单 A1001 已创建

每一行是一条独立记录。命令不会自动把多行 JSON 合成一条消息。按 Ctrl+C 退出生产者,Broker 仍然保持运行。

从头读取

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 \
  --topic hello-kafka --from-beginning \
  --group hello-readers

第一次使用这个组,应读到刚才三行,然后持续等待新消息。等待不是卡死。打开另一个生产者再输入一行,你会看到消费者很快显示它。

消费不会把记录从主题里删掉。停止消费者,再换一个从未使用过的组,比如 hello-readers-2,仍可以从头读取保留着的消息。

为什么重启后没有从头显示

--from-beginning 并不是“强行覆盖已有消费进度”。在没有有效已提交进度时,它让消费者从最早的可用位置开始。已有组通常从保存的进度继续。需要从头演示时,最简单的方法是换一个新组;正式重放需要有计划地重置进度。

本章检查点:你应当能看到消息;能解释主题不会因消费而清空;能区分“新组从头读”和“旧组继续读”。