Kafka是一个分布式流处理平台。提供高吞吐量、低延迟的消息发布/订阅服务,支持分布式存储和流处理。适用于日志收集存储、实时数据流处理(用户行为分析、监控系统和推荐系统)、消息队列(解耦生产者和消费者)、事件驱动架构(服务异步通信)、数据集成(通过Kafka Connect,可将Kafka与其它数据存储系统集成)。

架构

客户端-服务端架构

Kafka也是客户端-服务端的CS架构。它的客户端有两种状态:

  • 生产者是负责向服务端发送消息的客户端程序。
  • 消费者是从服务端读取消息的客户端程序,通常属于一个消费者组,同一组的消费者会协作消费“主题”中的消息。

接下来从大到小介绍Kafka的架构。

集群

Kafka集群由多个Broker(代理) 组成,每一个Broker是一个Kafka实例,负责存储对应分区(Partition) 的数据、处理客户端读写请求。Kafka使用Zookeeper(或者从Kafka2.8开始的KRaft) 进行集群管理,主要负责:

  • 存储元数据:分区分配、leader信息等。
  • 进行leader选举。
  • 监控Broker健康状态。

代理Broker

Broker本质就是运行在机器上的Kafka进程:

  • 存储分区数据、数据分布在集群的多个Broker上,从而实现负载均衡。
  • 处理客户端读写请求。
  • 通过唯一ID标识自己,用于监控、选举等。

主题Topic

Topic是消息的分类单元(比如不同类型的日志消息应该被分类到不同的Topic),生产者将消息发送到特定的Topic,消费者从Topic中读取消息。每一个Topic可以看作一个消息队列。

如果生产者和消费者都只能访问同一个Topic,会出现阻塞和单点故障的问题,因此Topic支持分区,减少阻塞。每一个Topic可以分为多个分区,每个分区可以有多个副本,用于单点故障恢复。

分区Partition

每一个分区可以分布在不同的Broker上,分区允许Kafka进行水平扩展:

  • 生产者可以指定发送到哪个分区,也可以只指定Topic,让Kafka根据分区策略自动分配。
  • 多个消费者可以并行读取不同分区的数据。
  • 每一个分区有一个Leader和Follower,Leader负责处理所有的读写请求,Follower作为备份,用于单点故障恢复。