跳转到内容

初识 Kafka


Apache Kafka 是一个开源的分布式事件流平台,最初由 LinkedIn 开发,后捐献给 Apache 基金会。它的核心能力是以极高的吞吐量持久化存储实时传输大规模消息流。

Kafka 的三种主要用途:

用途说明典型场景
消息队列系统间异步解耦订单通知、邮件发送
日志收集汇聚各服务日志集中处理ELK 日志平台
事件流处理实时计算、数据管道用户行为分析、实时推荐
Producer ──▶ [Broker 集群] ──▶ Consumer Group
Topic
├── Partition 0 [msg0, msg1, msg2 ...]
├── Partition 1 [msg0, msg1, msg2 ...]
└── Partition 2 [msg0, msg1, msg2 ...]

Topic(主题)

消息的逻辑分类单位,类似于数据库中的表。生产者向指定 Topic 发送消息,消费者订阅 Topic 消费消息。一个 Kafka 集群可以有成千上万个 Topic。

Partition(分区)

Topic 的物理分片。每个 Topic 可以划分为多个 Partition,每个 Partition 是一个有序、不可变的消息序列,存储在磁盘上。

  • 分区是 Kafka 水平扩展并行消费的基础;
  • 同一 Partition 内消息严格有序,不同 Partition 之间不保证顺序;
  • 消息写入 Partition 后不会被删除(根据保留策略定期清理)。

Broker

Kafka 集群中的单个服务节点。一个集群由多个 Broker 组成,每个 Broker 负责存储部分 Partition 的数据。

Producer(生产者)

向 Kafka Topic 发送消息的客户端。Producer 可以指定消息发往哪个 Partition,也可以交由 Kafka 按策略自动分配(轮询 / 按 Key 哈希)。

Consumer(消费者)

从 Kafka Topic 拉取消息的客户端。Kafka 采用消费者主动拉取(Pull) 模式,消费者自行控制消费速度和位移。

Consumer Group(消费者组)

多个消费者组成一个消费组,共同消费一个 Topic。Kafka 保证同一 Partition 在同一时刻只会被组内一个消费者消费,实现负载均衡。

Topic (3个分区) Consumer Group A (3个消费者)
Partition 0 ──────────▶ Consumer 1
Partition 1 ──────────▶ Consumer 2
Partition 2 ──────────▶ Consumer 3

不同消费者组之间完全独立,同一条消息可以被多个消费者组各自消费一次,天然支持广播场景。

Offset(消费位移)

每条消息在 Partition 中的唯一序号,从 0 开始单调递增。消费者通过提交 Offset 记录消费进度,重启后可以从上次的位置继续消费,也可以回溯到任意历史位置重新消费。

Partition 0: [msg0] [msg1] [msg2] [msg3] [msg4] ...
Offset: 0 1 2 3 4
当前消费位置

KRaft 是 Kafka 2.8+ 引入的新模式,无需依赖 Zookeeper,部署更简单,也是未来的主流方向。

version: '3'
services:
kafka:
image: bitnami/kafka:latest
container_name: kafka
ports:
- "9092:9092"
environment:
- KAFKA_CFG_NODE_ID=1
- KAFKA_CFG_PROCESS_ROLES=broker,controller # 单节点同时充当 broker 和 controller
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- ALLOW_PLAINTEXT_LISTENER=yes
volumes:
- kafka_data:/bitnami/kafka
volumes:
kafka_data:
Terminal window
docker-compose up -d
Terminal window
# 进入容器
docker exec -it kafka bash
# 创建 Topic(3个分区,1个副本)
kafka-topics.sh --create \
--topic test-topic \
--partitions 3 \
--replication-factor 1 \
--bootstrap-server localhost:9092
# 查看 Topic 列表
kafka-topics.sh --list --bootstrap-server localhost:9092
# 查看 Topic 详情
kafka-topics.sh --describe --topic test-topic --bootstrap-server localhost:9092
# 发送测试消息(命令行生产者)
kafka-console-producer.sh --topic test-topic --bootstrap-server localhost:9092
# 消费消息(--from-beginning 从头消费)
kafka-console-consumer.sh --topic test-topic \
--from-beginning \
--bootstrap-server localhost:9092
概念一句话总结
Topic消息的逻辑分类,类似数据库的表
PartitionTopic 的物理分片,有序、持久化存储
BrokerKafka 集群的服务节点
Producer向 Topic 发送消息的客户端
Consumer从 Topic 拉取消息的客户端(Pull 模式)
Consumer Group消费者集合,组内每个 Partition 只被一个消费者消费
Offset消息在 Partition 中的唯一序号,记录消费进度