本章内容包括
- 介绍本书的示例用例
- 使用
kafka-topics.sh
命令创建主题(topic) - 使用
kafka-console-producer.sh
命令发送(生产)消息 - 使用
kafka-console-consumer.sh
命令接收(消费)消息
在本章中,我们将深入 Apache Kafka 的实操世界,初步了解其工作方式。旅程从创建一个主主题开始,然后向该主题发送消息,最后再将这些消息消费回来,完成一个完整的循环,从而全面演示 Kafka 的基本操作。我们假定 Kafka 已经安装;在附录 B 中给出了用三个 broker 创建 Kafka 集群的详细安装说明。
2.1 介绍我们的用例
在整本书中,我们会使用一个一致的示例用例来说明如何在真实场景中有效使用 Kafka。我们选择的用例围绕一个电子商务平台(见图 2.1),作为展示 Kafka 能力的实用示例。

虽然我们的重点不是教你如何构建电子商务平台本身,但这个示例有助于将 Kafka 的关键概念和技术置于语境中。我们会涵盖诸如用户管理、商品管理、订单处理和支付集成等功能,展示 Kafka 如何在这些场景中增强数据流、实时处理和系统可扩展性。
2.2 生产(Producing)消息
让我们更仔细地看一下商品管理系统。我们的目标是将所有商品价格更新记录到 Kafka 中,首先要创建一个专用的 topic。记录这些价格更新对于维护价格变更历史、实现实时监控、执行分析并基于当前与历史价格数据做决策非常重要。要开始,我们先创建一个专用的 Kafka 主题。主题(topic)类似于数据库中的表,我们在主题中保存某一主题相关的数据集合。遵循常见的命名约定(使用小写字母并用点分隔各部分以保持清晰与一致性),我们将主题命名为 products.prices.changelog
。创建主题的方式如下:
css
$ kafka-topics.sh \
--create \
--topic products.prices.changelog \
--partitions 1 \
--replication-factor 1 \
--bootstrap-server localhost:9092
Created topic products.prices.changelog.
我们使用 kafka-topics.sh
命令来管理 Kafka 中的主题。这个脚本以及我们在示例中会用到的许多其它脚本,都随 Kafka 一起发布。在这里我们通过 --create
参数告诉 Kafka 创建 products.prices.changelog
主题(--topic products.prices.changelog
)。起初我们使用一个分区(--partitions 1
)并且不进行数据复制(--replication-factor 1
),使示例保持简单。最后,我们指定要连接的 Kafka 集群------在本例中使用本地集群,默认监听端口 9092(--bootstrap-server localhost:9092
)。命令会确认主题已成功创建。如果此处出现错误,常见原因是 Kafka 尚未启动导致无法访问,或主题已存在。
注意:Confluent 的 Kafka 脚本没有 .sh
后缀。对于 Windows 用户,这些脚本有 .bat
版本;不过我们强烈建议使用 Windows Subsystem for Linux (WSL) 以获得更佳体验。
现在我们有了存放价格更新的地方。每当某个商品价格发生更改时,我们就向该主题生产一条新消息。用于练习的工具是 kafka-console-producer.sh
命令行工具。该 producer 连接到 Kafka,从命令行读取数据并将其作为消息发送到指定主题(通过 --topic
参数配置)。例如,把消息 coffee pads 10
写入 products.prices.changelog
主题:
lua
$ echo "coffee pads 10" | kafka-console-producer.sh \
--topic products.prices.changelog \
--bootstrap-server localhost:9092
注意:Kafka 控制台生产者在成功发送消息后不会打印确认信息。由于我们用 echo
的输出直接管道到 producer,生产者并未进入交互式输入模式,因此不会显示任何反馈。
注意:如果你是咖啡爱好者,可能会注意到代码示例中用了 "coffee pad" 而不是更常见的 "coffee pod"。两者确有差异,但最终都会变成一杯咖啡------这才是关键,不是吗?
2.3 消费(Consuming)消息
我们的分析组件现在需要读取这些数据。该组件可以实时分析价格变动对订单的影响,从而使价格策略与库存管理及时作出调整。要检索刚才发送的消息,我们启动 kafka-console-consumer.sh
------它是 Kafka 命令行工具集的重要成员:
css
$ kafka-console-consumer.sh \
--topic products.prices.changelog \
--bootstrap-server localhost:9092
# Press Ctrl-C to cancel
Processed a total of 0 messages
当我们启动 kafka-console-consumer.sh
时,它默认会持续运行,直到我们主动取消(例如按 Ctrl-C
)。对于消费者,我们必须再次指定它应使用的主题(--topic products.prices.changelog
)。
有点令人惊讶的是,此时并没有显示任何消息。这是因为默认情况下,kafka-console-consumer.sh
会从主题的末尾开始读取,只会打印之后到达的新消息。要显示已写入的历史数据,需要加上 --from-beginning
标志:
css
$ kafka-console-consumer.sh \
--topic products.prices.changelog \
--from-beginning \
--bootstrap-server localhost:9092
coffee pads 10
# Press Ctrl-C to cancel
Processed a total of 1 messages
这一次,我们看到了消息 coffee pads 10
!究竟发生了什么?我们先用 kafka-topics.sh
在 Kafka 中创建了主题 products.prices.changelog
,再用 kafka-console-producer.sh
生产了消息 coffee pads 10
,随后用 kafka-console-consumer.sh
读取了该消息(见图 2.2)。默认情况下 kafka-console-consumer.sh
总是从末尾开始读,因此如果想读取所有消息(包含历史消息),需要使用 --from-beginning
标志。

2.4 并行消费与生产消息
有趣的是,与许多消息系统不同,Kafka 允许我们根据需要多次读取消息。这一能力使得多个独立的消费者(代表不同的系统)可以连接到同一主题并同时访问数据。例如,我们可以让分析系统和库存管理系统同时消费价格变更(见图 2.3)。此外,有时我们需要对销售进行回溯性分析,需要访问历史价格。在这种情况下,我们可以多次重新运行消费者,每次都检索相同的数据以便进一步评估。
但是现在我们希望在库存管理系统中看到当前价格,并且一有新数据就能立即更新。为此,我们在一个终端窗口中启动 kafka-console-consumer.sh
来模拟库存管理系统。只要有新数据可用,消费者就会从 Kafka 拉取并在命令行中显示它:
css
# 别忘了:用 Ctrl-C 停止消费者
$ kafka-console-consumer.sh \
--topic products.prices.changelog \
--bootstrap-server localhost:9092

将价格变更模拟出来,我们现在启动 kafka-console-producer.sh
。该命令会一直运行,直到我们按 Ctrl-D
发送 EOF(文件结束)信号来停止它:
css
# 别忘了:用 Ctrl-D 停止生产者
$ kafka-console-producer.sh \
--topic products.prices.changelog \
--bootstrap-server localhost:9092
kafka-console-producer.sh
命令对我们每输入的一行都会向 Kafka 发送一条消息。也就是说,我们现在可以在生产者终端里键入消息:
markdown
# Producer 窗口
> coffee pads 11
> coffee pads 12
> coffee pads 10
在消费者窗口里应该能及时看到这些消息:
bash
# Consumer 窗口
coffee pads 11
coffee pads 12
coffee pads 10
现在,我们还希望用销售分析工具来消费这些消息,该工具会独立启动它自己的消费者。我们可以在另一个终端里启动另一个 kafka-console-consumer.sh
来模拟这一点------该消费者从头开始显示所有数据。因此我们会看到 coffee pads 10
出现两次,因为它也是本章开头生产的第一条消息:
css
# Consumer 2 窗口
$ kafka-console-consumer.sh \
--topic products.prices.changelog \
--from-beginning \
--bootstrap-server localhost:9092
coffee pads 10
coffee pads 11
coffee pads 12
coffee pads 10
这里可以看到,一旦数据被写入,多个消费者可以并行读取相同的数据,而彼此之间无需通信。Kafka 默认会保留数据七天,但我们也可以将其配置为不删除数据(即永不过期)。这样的话,后来需要历史数据的消费者仍然可以启动并读取这些历史记录。
再考虑一个场景:不同部门可能会触发不同的价格变更,它们各自负责不同的产品品类。Kafka 能无缝处理这种多来源的变动,并高效地同时处理来自多个生产者的数据流(每个生产者代表一个产品品类),如图 2.4 所示。为演示这一点,我们在另一个终端再启动一个生产者:
css
# Producer 2 窗口
$ kafka-console-producer.sh \
--topic products.prices.changelog \
--bootstrap-server localhost:9092
markdown
> pillow 30
> blanket 40
我们会在所有消费者中按消息产生的顺序看到来自所有生产者的消息:
ini
# Consumer 1 窗口
[...]
pillow 30
blanket 40
# Consumer 2 窗口
[...]
pillow 30
blanket 40

我们现在已经成功完成了第一个 Kafka 用例------向 Kafka 写入并从 Kafka 读取数据。起初,我们使用 kafka-topics.sh
命令行工具创建了名为 products.prices.changelog
的主题,用来存储所有商品的价格变更。接着,我们用 kafka-console-producer.sh
命令将价格更新写入该主题。随后,我们使用 kafka-console-consumer.sh
将这些数据读取并显示出来。进一步地,我们演示了如何用多个生产者并行地生产数据,同时用多个消费者并行地读取数据。通过在 kafka-console-consumer.sh
中使用 --from-beginning
标志,我们能够访问历史数据。通过这一过程,我们熟悉了如何使用 Kafka 的命令行工具进行数据的写入与读取。
在获得这些实践经验后,我们可以关闭所有打开的终端:用 Ctrl-D
关闭生产者,用 Ctrl-C
关闭消费者。需要注意的是,这个示例并不能掩盖一个事实:Kafka 常被用于处理更大规模的数据(例如每秒几十 GB 的级别)。
2.5 Kafka 的图形用户界面
Kafka 的图形用户界面(GUI)在简化 Kafka 集群的管理与监控方面起着重要作用。例如,开源的 Kafbat UI(github.com/kafbat/kafk...;见图2.5)或商业产品 Kadeck(<www.kadeck.com>)都提供了直观的交互界面。这些 GUI 使用户能够可视化数据流,监控并管理主题、分区和消费者组,并方便地执行管理任务。尤其是 Kafbat UI,能够提供对 Kafka 集群的全貌式视图,简化消息流跟踪、审计日志检查与系统配置等操作。这种可视化和易用性提升了整体用户体验,使开发人员与管理员更容易确保 Kafka 生态的高效运行。
警告:我们强烈建议不要在生产环境中通过 GUI 写入数据或修改配置。在生产环境中通过 GUI 生产消息可能导致不一致、错误处理不足以及可扩展性差等问题。Kafka 的设计初衷是系统对系统的数据交换,而非人为交互。除非在绝对紧急的情况下由管理员操作,人类不应在生产环境频繁通过 GUI 来生产或消费数据。
在本章对 Kafka 做了初步概览并通过实操场景演示之后,下一章我们将更深入地探讨 Kafka 的架构细节。我们会看清楚 Kafka 消息的结构以及它们如何被组织进主题;并在此语境下进一步讨论 Kafka 的可扩展性与可靠性,同时深入了解生产者、消费者以及 Kafka 集群本身。

总结
- Kafka 提供了许多用于管理主题以及生产/消费消息的实用脚本。
- 可以使用
kafka-topics.sh
命令创建 Kafka 主题。 - 可以使用
kafka-console-producer.sh
命令生产(写入)消息。 - 可以使用
kafka-console-consumer.sh
命令消费(读取)主题。 - 我们可以从头(
--from-beginning
)再次消费主题中的消息。 - 多个消费者可以独立且同时消费同一主题。
- 多个生产者可以并行向主题写入消息。
- Kafka 的图形界面(GUI)允许用户查看主题内的实时消息,展示消息键、消息值、时间戳等详细信息。
- 这些 GUI 有助于对 Kafka 数据流进行有效的监控与故障排查。