入门教程 - 高吞吐流处理核心概念

知识库
知识库文档
/tech-stacks/apache-kafka/tutorial/入门教程 - 高吞吐流处理核心概念.md

文档

Kafka 入门教程:高吞吐流处理核心概念

1. Kafka 与其他 MQ 的区别

维度 RabbitMQ Kafka
定位 消息代理(Message Broker) 事件流平台(Event Streaming)
吞吐量 万级/秒 百万级/秒
消息保留 消费后删除 基于时间/大小保留
消费模式 Push Pull
顺序保证 队列级 分区级
消息回溯 不支持 支持(重置 offset)

2. 核心概念深入

Topic & Partition

  • Topic 是消息的逻辑分类,如 orderslogs
  • 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. 思考题

  1. 为什么 Kafka 要采用 Pull 模型而非 Push?
  2. Partition 数量设置多少合适?多了和少了分别有什么问题?
  3. 如何保证跨 Partition 的全局有序?有什么代价?

信息

路径
/tech-stacks/apache-kafka/tutorial/入门教程 - 高吞吐流处理核心概念.md
更新时间
2026/5/31