初识 Kafka
1. Kafka 是什么
Section titled “1. Kafka 是什么”Apache Kafka 是一个开源的分布式事件流平台,最初由 LinkedIn 开发,后捐献给 Apache 基金会。它的核心能力是以极高的吞吐量持久化存储并实时传输大规模消息流。
Kafka 的三种主要用途:
| 用途 | 说明 | 典型场景 |
|---|---|---|
| 消息队列 | 系统间异步解耦 | 订单通知、邮件发送 |
| 日志收集 | 汇聚各服务日志集中处理 | ELK 日志平台 |
| 事件流处理 | 实时计算、数据管道 | 用户行为分析、实时推荐 |
2. 核心概念
Section titled “2. 核心概念”2.1. 整体架构
Section titled “2.1. 整体架构”Producer ──▶ [Broker 集群] ──▶ Consumer Group Topic ├── Partition 0 [msg0, msg1, msg2 ...] ├── Partition 1 [msg0, msg1, msg2 ...] └── Partition 2 [msg0, msg1, msg2 ...]2.2. 概念详解
Section titled “2.2. 概念详解”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 1Partition 1 ──────────▶ Consumer 2Partition 2 ──────────▶ Consumer 3不同消费者组之间完全独立,同一条消息可以被多个消费者组各自消费一次,天然支持广播场景。
Offset(消费位移)
每条消息在 Partition 中的唯一序号,从 0 开始单调递增。消费者通过提交 Offset 记录消费进度,重启后可以从上次的位置继续消费,也可以回溯到任意历史位置重新消费。
Partition 0: [msg0] [msg1] [msg2] [msg3] [msg4] ...Offset: 0 1 2 3 4 ↑ 当前消费位置3. 环境搭建(Docker KRaft 模式)
Section titled “3. 环境搭建(Docker KRaft 模式)”KRaft 是 Kafka 2.8+ 引入的新模式,无需依赖 Zookeeper,部署更简单,也是未来的主流方向。
3.1. docker-compose.yml
Section titled “3.1. docker-compose.yml”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:3.2. 启动
Section titled “3.2. 启动”docker-compose up -d3.3. 验证(进入容器操作)
Section titled “3.3. 验证(进入容器操作)”# 进入容器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:90924. 核心概念速查
Section titled “4. 核心概念速查”| 概念 | 一句话总结 |
|---|---|
| Topic | 消息的逻辑分类,类似数据库的表 |
| Partition | Topic 的物理分片,有序、持久化存储 |
| Broker | Kafka 集群的服务节点 |
| Producer | 向 Topic 发送消息的客户端 |
| Consumer | 从 Topic 拉取消息的客户端(Pull 模式) |
| Consumer Group | 消费者集合,组内每个 Partition 只被一个消费者消费 |
| Offset | 消息在 Partition 中的唯一序号,记录消费进度 |