为了更好的理解Kafka的工作流程,将其想象成一个 “智能邮局”,专门负责在不同系统之间传递 “消息”(列如用户下单、物流更新这类信息)。
一、Kafka 的 “组成成员”(核心组件)
把 Kafka 想象成一个邮局,这些组件就是邮局里的 “角色”:
- 生产者(Producer):就是寄信的人。列如电商系统里,“下单服务” 会产生 “用户下单” 的消息,它就是生产者,负责把消息发给 Kafka。
- 消费者(Consumer):就是收信的人。列如 “物流服务”“库存服务” 需要订阅 “下单消息” 来处理发货、扣库存,它们就是消费者,从 Kafka 里拿消息。
- 主题(Topic):就是“信件分类箱”。列如邮局里的 “快递箱”“平信箱”,Kafka 里用 “主题” 区分不同类型的消息。列如专门存 “订单消息” 的主题叫order_topic,存 “物流消息” 的叫logistics_topic。
- 分区(Partition):是 “分类箱里的小格子”。一个主题会被分成多个 “分区”,就像 “快递箱” 里又分 “北京区”“上海区” 小格子,这样可以把消息分散存储,提高处理效率。
- Broker(代理节点):是 “邮局的服务器”。实际存储消息的机器,一个 Kafka 集群由多个 Broker 组成,就像邮局有多个分点,共同承担存储和转发消息的任务。
- Zookeeper:是快递站的 “管理员”。负责管理 Kafka 集群的元数据(列如哪个 Broker 是 Leader、消费者的消费位置等)。
二、Kafka 的 “工作流程”(消息从产生到被消费的过程)
还是以 “电商下单” 为例,看看消息是怎么在 Kafka 里流转的:
步骤 1:生产者发消息 → 像 “寄信人投信”
假设用户在电商平台下单,“下单服务” 作为生产者,会把 “用户 A 下单了一部手机” 这个消息,发送到 Kafka 的 “订单主题(order_topic)” 里。
步骤 2:Kafka 存消息 → 像 “邮局分箱存信”
Kafka 收到 “下单消息” 后,会把这个主题(order_topic)分成多个分区(列如 3 个分区),然后把消息分散存到不同分区里。这样做有两个好处:
- 多个分区可以并行存储,提高效率;
- 后续多个消费者可以同时从不同分区拿消息,加快处理速度。
步骤 3:消费者拿消息 → 像 “收信人取信”
“物流服务”“库存服务” 作为消费者,会订阅 “order_topic” 这个主题。它们会主动从 Kafka 的分区里拉撤销息,列如 “物流服务” 拿到 “用户 A 下单” 的消息后,就会安排发货;“库存服务” 拿到后,就会扣减手机库存。
Kafka 就像个 “智能快递站”:生产者寄消息到指定 “货架(Topic+Partition)”,Broker 仓库负责存储和备份,消费者组按需拉撤销息处理,Zookeeper 全程管理集群状态。这样就能让不同系统之间的消息传递又快又稳。
使用Kafka保证 Kafka 中消息的可靠性(不丢消息、不重复消息)和一致性(消息顺序、处理原子性)至关重大,可以通过以下机制组合实现:
三、保证消息可靠性的核心机制
1. 生产者端:确认机制 + 幂等性
- acks参数配置:
- 生产者发送消息时,通过acks参数指定 “消息需要被多少个 Broker 确认”:
- acks=0:生产者发完就不管,可能丢消息(不推荐)。
- acks=1:只需要 Leader 副本确认收到,若 Leader 宕机且数据未同步到 Follower,会丢消息。
- acks=all(或-1):需要所有 ISR(同步副本列表)的 Broker 都确认,彻底避免消息丢失(推荐生产环境使用)。
- 幂等性生产者:
- 开启后,生产者会给每个消息分配唯一 ID(Producer ID + 序列号),即使网络重试导致重复发送,Kafka 也会自动去重,保证消息不重复。
2. Broker 端:副本机制 + ISR + 持久化
- 分区副本:每个分区有多个副本(1 个 Leader + 多个 Follower),Follower 会实时同步 Leader 的数据。若 Leader 宕机,Kafka 会从 ISR 中选举新的 Leader,避免数据丢失。
- ISR(同步副本列表):只有与 Leader 数据同步的副本才会被纳入 ISR。选举 Leader 时只从 ISR 中选,保证新 Leader 的数据是最新的,避免数据不一致。
- 磁盘持久化:所有消息都会写入磁盘,即使 Broker 重启,数据也不会丢失。
3. 消费者端:Offset 管理
消费者需要正确管理 “消费位置”(Offset),避免重复消费或漏消费:
- 自动提交 Offset:消费者默认会定期自动提交 Offset,但如果在提交后、处理消息前宕机,会导致消息重复消费。
- 手动提交 Offset:在代码中手动控制 Offset 提交时机(如处理完消息后提交),保证至少一次消费(消息不丢,可能重复,结合幂等性可实现 Exactly Once)。
四、保证消息一致性的核心机制
1. 分区内消息有序
Kafka 的单个分区内的消息是严格有序的(由于一个分区同一时间只被一个消费者消费)。若业务需要 “某类消息的全局顺序”,可将主题的分区数设为 1,但会牺牲吞吐量。
2. 事务机制(Exactly Once 语义)
Kafka 从 0.11 版本开始支持事务,可以将 “生产者发送消息” 和 “消费者提交 Offset” 绑定为一个原子操作,保证:
- 生产者要么全发成功,要么全失败(避免部分消息发送成功)。
- 消费者要么全消费成功,要么全回滚(避免消费一半后宕机导致数据不一致)。
- 结合 “幂等性生产者”,可实现Exactly Once(消息只被处理一次)。
3. 消费者组的分区分配
同一个消费者组内的多个消费者,会通过 “分区分配策略”(如轮询、范围)公平分配主题的分区,保证每个分区只被一个消费者消费,从而控制消费顺序和一致性。
可靠和一致性总结
- 可靠性:通过生产者acks=all、副本 + ISR、持久化、消费者 Offset 管理、幂等性实现。
- 一致性:通过分区内有序、事务机制、消费者组分区分配实现。

有收获👏