文档
Kafka 入门教程:高吞吐流处理核心概念
1. Kafka 与其他 MQ 的区别
| 维度 | RabbitMQ | Kafka |
|---|---|---|
| 定位 | 消息代理(Message Broker) | 事件流平台(Event Streaming) |
| 吞吐量 | 万级/秒 | 百万级/秒 |
| 消息保留 | 消费后删除 | 基于时间/大小保留 |
| 消费模式 | Push | Pull |
| 顺序保证 | 队列级 | 分区级 |
| 消息回溯 | 不支持 | 支持(重置 offset) |
2. 核心概念深入
Topic & Partition
- Topic 是消息的逻辑分类,如
orders、logs - Partition 是物理存储单元,每个 Partition 是一个有序不可变日志
- 消息在 Partition 内严格有序,跨 Partition 无序
Producer 分区策略
# 1. 指定 key → hash(key) % num_partitions 决定分区
producer.send('topic', key='user_123', value=data)
# 2. 指定 partition → 直接写入
producer.send('topic', partition=0, value=data)
# 3. 都不指定 → 轮询
producer.send('topic', value=data)
Consumer Group
- 同一 Group 内,每个 Partition 只被一个 Consumer 消费
- 不同 Group 独立消费(广播)
- Group 内 Consumer 数量 ≤ Partition 数量,多余的 Consumer 空闲
3. 偏移量(Offset)管理
Partition 0: [msg0] [msg1] [msg2] [msg3] [msg4] ...
↑ ↑
earliest current offset
# 重置偏移量 - 回溯消费
consumer.seek(topic_partition, offset) # 精确重置
consumer.seek_to_beginning() # 从头开始
consumer.seek_to_end() # 跳到最新
4. 精确一次语义(Exactly-Once)
Kafka 通过以下机制实现 EOS:
- 幂等生产者:
enable.idempotence=true - 事务:
producer.init_transactions()+producer.commit_transaction() - 消费者隔离级别:
isolation.level=read_committed
5. Kafka Streams 简介
无需额外集群,直接在应用内做流处理:
KStream<String, Order> orders = builder.stream("orders");
KTable<String, Double> totalByUser = orders
.groupByKey()
.aggregate(() -> 0.0,
(key, order, total) -> total + order.getAmount(),
Materialized.as("order-total-store"));
6. 思考题
- 为什么 Kafka 要采用 Pull 模型而非 Push?
- Partition 数量设置多少合适?多了和少了分别有什么问题?
- 如何保证跨 Partition 的全局有序?有什么代价?