编辑
2026-06-04
java炒饭
00
请注意,本文编写于 79 天前,最后修改于 79 天前,其中某些信息可能已经过时。

目录

一、Kafka 的整体架构(先有个图景)
二、核心名词概念详解
1. Topic(主题)
2. Partition(分区)
3. Producer(生产者)
4. Consumer(消费者)
5. Consumer Group(消费者组)—— 这是 Kafka 最巧妙的设计
6. Broker(代理节点)
7. ISR(In-Sync Replicas)
8. Offset(偏移量)
三、Topic 与消费者组的关系(重点)
四、消息流转完整过程(结合概念)
五、为什么 Kafka 这么强?(基于以上架构的优势)
六、一张简表总结

Kafka 是一个 分布式、可持久化的消息队列系统,但它比传统消息队列更强:能存储大量数据、支持高吞吐、还能重复消费历史消息。


一、Kafka 的整体架构(先有个图景)

Kafka 集群由多个 Broker 组成(Broker 就是一台 Kafka 服务器)。
消息通过 Producer 发送到 Broker 的某个 Topic 里;
Consumer 从 Topic 拉取消息进行消费。

Producer1 ──┐ Producer2 ──┼──► Broker1 (Leader) ──┬──► Consumer Group A (成员1) Producer3 ──┘ Broker2 (Follower) └──► Consumer Group A (成员2) Broker3
  • ZooKeeper / KRaft:早期 Kafka 用 ZooKeeper 管理集群元数据(如 Broker 列表、Topic 配置);新版本用内置的 KRaft 替代 ZooKeeper,原理类似。

二、核心名词概念详解

1. Topic(主题)

  • 是什么:消息的分类容器。比如“订单消息”发到 order-topic,“用户行为”发到 user-action-topic
  • 特点:一个 Topic 可以有多个 Partition(分区)。分区是物理上的存储单元,每个分区是一个有序的消息日志文件。
  • 为什么分区:为了横向扩展。一个 Topic 可以分散存储在多个 Broker 上,通过多分区实现高吞吐(并行读写)。

2. Partition(分区)

  • 消息顺序:每个分区内部消息是严格有序的(FIFO),但跨分区不保证顺序。
  • 偏移量(Offset):每条消息在分区内的唯一序号,从 0 开始递增。消费者通过 Offset 来定位消息。
  • 副本(Replica):每个分区可以有多个副本(Leader + Follower),Leader 处理读写,Follower 同步数据,保证高可用。

3. Producer(生产者)

  • 负责发送消息到 Topic 的指定分区(可指定 key,相同 key 的消息去同一分区)。
  • 可以设置 acks 参数控制可靠性:
    • acks=0:不等待确认,最快,可能丢数据。
    • acks=1:Leader 写入成功即确认。
    • acks=-1/all:Leader 和所有 ISR(同步副本)都写入才确认,最可靠。

4. Consumer(消费者)

  • 从 Topic 的分区拉取消息。
  • 消费者需要指定 Consumer Group(消费者组)。

5. Consumer Group(消费者组)—— 这是 Kafka 最巧妙的设计

  • 定义:一组具有相同 group.id 的 Consumer 实例。
  • 核心规则:一个分区内的消息,只能被同一个消费者组内的 一个 消费者消费。
  • 作用
    • 负载均衡:如果组内有多个消费者,Kafka 会自动将分区分配给它们,实现并行消费。
    • 容错:如果某个消费者挂了,它负责的分区会重新分配给组内其他消费者。
    • 消息不重复消费:不同消费者组对同一条消息是“独立”的——两个不同组可以消费同一条消息,就像两个独立的订阅者。

举例:Topic order-topic 有 3 个分区(P0, P1, P2)。

  • 消费者组 G1 有 3 个消费者:每人分一个分区,并行消费,每条消息被消费 1 次
  • 消费者组 G2 有 2 个消费者:其中一个消费者分到 2 个分区,另一个分到 1 个分区,消息在 G2 内也只消费 1 次。
  • 如果 G1 和 G2 同时消费,同一条消息会被两个组各消费一次 —— 不同组的消费是隔离的

6. Broker(代理节点)

  • 一台 Kafka 服务器就是一个 Broker,负责存储消息、处理读写请求。
  • 多个 Broker 组成集群。一个 Broker 可以承载多个分区的 Leader 或 Follower。

7. ISR(In-Sync Replicas)

  • 与 Leader 保持同步的副本集合。如果 Follower 复制落后太多,会被踢出 ISR。
  • 只有 ISR 中的副本才有资格被选为新 Leader。

8. Offset(偏移量)

  • 每个分区内消息的序号(long 型)。消费者需要提交自己已经消费到的 Offset,以便故障恢复后继续消费。
  • Kafka 将每个消费者组的 Offset 保存在一个内部 Topic __consumer_offsets 中。

三、Topic 与消费者组的关系(重点)

特性TopicConsumer Group
角色消息的存放地消费者的组织单位
关键属性分区数、副本数group.id
消息流向Producer → Topic → Consumer组内消费者共同承担分区消费
消息消费范围每个分区只能被同一个组内的一个消费者消费不同组可以独立消费全部消息

一个经典的提问:如果消费者组内的消费者数量 > Topic 的分区数量,会怎样?
→ 多余的消费者将空闲(没有分区可分配)。因此一般设置消费者数 ≤ 分区数。


四、消息流转完整过程(结合概念)

  1. 创建 Topic:指定分区数(例如 3)、副本数(例如 2)。
  2. Producer 发送消息:消息被追加到某个分区的 Leader 副本末尾。
  3. Broker 同步:Follower 从 Leader 拉取消息,保持同步。
  4. Consumer 启动:加入指定的 Consumer Group,Kafka 根据分区分配策略(如 Range、RoundRobin)分配分区给消费者。
  5. Consumer 拉取消息:不断拉取自己分配到的分区,处理消息,并定期提交 Offset(自动或手动)。
  6. 重平衡(Rebalance):当消费者组内成员变动(新增、退出、崩溃),Kafka 会重新分配分区,这个过程叫 Rebalance。期间该组会短暂停止消费。

五、为什么 Kafka 这么强?(基于以上架构的优势)

  • 高吞吐:分区并行 + 批量读写 + 顺序 IO。
  • 持久化:消息直接刷盘,且可配置保留时间(默认 7 天)。
  • 高可用:副本机制 + ISR + 自动 Leader 选举。
  • 可回溯消费:因为消息不删除(按时间/容量删除),消费者可以重置 Offset 到过去某个时刻重新消费。
  • 解耦:不同消费者组独立消费,互不影响。

六、一张简表总结

概念一句话解释
Topic逻辑上的消息分类
PartitionTopic 的物理分片,提供顺序和并行能力
Producer发消息的人
Consumer收消息的人
Consumer Group一组消费者,共同消费一个 Topic,彼此分担负载
BrokerKafka 服务器节点
Offset分区内消息的序号
ISR与 Leader 保持同步的副本集合

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay