一、Kafka 介绍

Kafka 是一种高吞吐、分布式、基于发布和订阅模型的消息系统。

Kafka 用于离线和在线消息的消费,将消息数据按顺序保存在磁盘上,并在集群内以副本的形式存储以防止数据丢失。Kafka 依赖 ZooKeeper 进行集群管理(注:Kafka 3.x 起逐步支持 KRaft 模式,可脱离 ZooKeeper),并且受到越来越多的分布式处理系统的青睐,比如 Storm、Spark、Flink 等都支持与 Kafka 集成,用于实时流式计算。

Kafka 本质是一个消息队列,消息队列是一种进程间通信或者同一个进程中不同线程间的通信方式,主要解决异步处理、应用耦合、流量削峰等问题,实现高性能、高可用、可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件。

1.1、异步处理

用户注册后,主流程只需写入数据库并返回成功,发送欢迎邮件、初始化积分等耗时操作通过 Kafka 异步投递给下游消费者处理。这样接口响应更快,系统吞吐量更高。

1.2、应用解耦

订单服务和库存服务不直接 RPC 调用,订单服务发布「订单创建」事件,库存、物流、积分等多个服务各自订阅消费。新增下游时只需新增 Consumer,无需改动订单服务代码。

1.3、流量削峰

秒杀或大促时,请求先写入 Kafka 缓冲,后端服务按自身处理能力匀速消费,避免数据库被瞬时流量打垮。相当于在入口和核心服务之间加了一层蓄水池。

二、传输模式

2.1、点对点模型

生产者发送消息到 Queue,一条消息只被一个消费者消费,消费后即从队列移除。适合任务分发场景,如日志处理、异步任务。

2.2、发布、订阅模型

生产者将消息发布到 Topic,所有订阅该 Topic 的消费者都能收到同一条消息的副本。Kafka 默认采用此模型,通过 Consumer Group 实现「组内竞争消费、组间广播」。

三、系统架构

3.1、系统架构

  • Producer:生产者,负责将客户端生产的消息发送到 Kafka 中,支持异步发送和批量发送
  • Broker:服务代理节点,Kafka 集群中的一台服务器就是一个 broker,可水平扩展,同一 Topic 的消息分布在多个 broker 中
  • Consumer:消费者,连接到 Kafka 拉取消息,执行业务逻辑
  • Consumer Group:消费者组,多个消费者组成一组共同消费一个 Topic。同一组内每条消息只被一个消费者处理;不同组各自独立消费全量消息
  • ZooKeeper / KRaft:负责集群元数据管理、Controller 选举、分区 Leader 切换等

整体流程:Producer → Broker(持久化到磁盘)→ Consumer 拉取消费。

3.2、Topic 与 Partition

消息以 Topic 为单位归类,Topic 在逻辑上类似一个队列。为提升吞吐量,Topic 在物理上划分为多个 Partition,每个分区在磁盘上对应一个文件夹,消息在分区内有序。

分区数决定并行度上限:Consumer Group 中活跃消费者数不应超过分区总数,否则多余消费者空闲。

3.3、Leader 和 Follower

每个分区有多个副本,一主(Leader)多从(Follower)。Leader 处理读写请求,Follower 从 Leader 同步数据。Leader 宕机时,Controller 从 ISR(In-Sync Replicas)中选举新 Leader。

3.4、消息可靠性

  • acks=0:不等待确认,最快但可能丢消息
  • acks=1:Leader 写入即返回,Leader 宕机可能丢未同步数据
  • acks=all:ISR 全部确认才返回,最可靠

配合 min.insync.replicas 和生产者重试,可在性能与可靠性之间取舍。

3.5、消费位移(Offset)

Consumer 通过 offset 记录消费进度,保存在 Kafka 内部 topic __consumer_offsets 中。Rebalance 时按 offset 继续消费,保证至少一次(at-least-once)语义;业务侧需自行保证幂等。