Apache Kafka的架构

1. Apache Kafka API

Apache Kafka有四个核心API:Producer API,Consumer API,Streams API和Connector API

pic

a. Producer API

Producer API允许应用程序将记录流发布到一个或多个Kafka主题。

b. Consumer API

Consumer API允许应用程序订阅一个或多个主题并处理为其生成的记录流。

c. Streams API

Streams API允许应用程序充当流处理器,处理来自一个或多个主题的输入流并生成一个新的输出流,然后输出到一个或多个输出主题,从而有效地将输入流转换为输出流。

d. Connector API

Connector API允许构建和运行将Kafka主题连接到现有应用程序或数据系统的可重用的生产者或使用者,例如,关系数据库的连接器可以捕获对表的每个更改。

2. Apache Kafka架构

下图显示了Kafka的集群结构:

pic

我们来逐一讨论上图中的每个组件。

a. Kafka代理(Broker) 

为了维持负载平衡,Kafka集群通常由多个代理组成。但是,这些代理是无状态的,所以他们使用ZooKeeper来维护集群状态。一个Kafka代理实例每秒可以处理数十万次读写操作,因此在性能不受影响的情况下,每个代理都可以处理TB消息。此外,需要确保用ZooKeeper执行Kafka代理的领导者选举(Leader election)工作。

b. Kafka Zookeeper

Kafka代理使用ZooKeeper来管理和协调集群中的节点,另外使用它来通知生产者和消费者Kafka系统中有新代理的加入或某个代理出现故障。一旦Zookeeper发送有关新代理加入或者已有代理故障的通知,生产者和消费者就做出决定并开始与其他代理协调他们的任务。

c. Kafka生产者(Producer)

Kafka的生产者将数据推送给代理。当一个新的代理加入集群并启动后,所有的生产者都会搜索它并自动向这个新代理发送消息。请记住,生产者会以代理可以处理的最快速度发送消息,它不会等待来自代理的确认。

d. Kakfa消费者(Consumer)

因为Kafka代理是无状态的,Kafka Consumer通过使用分区偏移量来维护已处理了多少消息。 一旦消费者确认了一个特定的消息偏移量,我们可以确信消费者已经消费了这个偏移量之前所有的消息。消费者向代理发出异步拉取请求,让字节缓冲区做好准备,然后,消费者只需提供一个偏移值,它就可以跳转到分区中的任何位置。 ZooKeeper会通知消费者偏移量的具体值。 

3. Apache Kafka基础概念

a. Kafka主题(Topic) 

主题是一个逻辑通道,生产者向主题发布消息,消费者从主题中接收消息。

  • 主题定义了Kafka中特定类型数据的流。

  • 消息是结构化的, 特定的消息发布到特定的主题中。

  • 生产者首先把消息发布到主题,然后消费者从主题中读取这些消息。

  • 在Kafka集群中,主题以名字区分并且是唯一的。

  • 可以有任意数量的主题,没有限制。

  • 消息被发布后我们就不能再更改它。

下图显示了Kafka主题和分区之间的关系:

pic

b. Kafka中的分区

在Kafka集群中,主题被分到多个分区上,并且能够跨代理复制。 

  • 但是Kafka不能保证向某哪以个分区发布消息

  • 我们可以给消息添加一个键值(Key),如果生产者发布的消息带有键值的话,我们能确保带有相同键值的消息最终被发布到同一个分区上。因此基于这个功能,Kafka提供消息排序保证。但是,除非消息带有键值,否则消息会被随机发布到任意的分区上。

  • 在同一个分区中,消息以排序的方式存储。

  • 在同一个分区中,每条消息都被分配一个增量ID,也称为偏移量。

  • 仅在同一个分区内,偏移量才有意义,在一个主题内,偏移量在分区之间没有值。

  • 可以有任意数量的分区,没有限制。

c. Kafka中的主题复制因子

在设计Kafka系统时,将主题复制考虑在内是一个明智的决定。如果一个代理故障,那么这个危机可以通过在其他代理上使用主题的副本来解决。例如,我们有3个代理和3个主题,Broker1上有Topic1和Partition0,它的副本在Broker2中,依此类推。主题的复制因子为2; 这意味着这个主题除了在当前的代理中有主题本身之外还将有一个额外的副本。

以下是主题复制因子的图像:

pic

一些关键点:

  • 复制仅在分区级别进行。

  • 对于一个给定的分区,一次只有一个代理可以成为领导者(Leader)。同时,其他的代理将拥有已同步的复制品 – 我们称之为ISR(In-Sync Replica)。

  • 复制因子的值不能超过可用代理的数量。

d. 消费者组(Consumer Group) 

  • 可以有多个消费者进程或者实例同时运行。

  • 一个消费者组将拥有一个唯一的组ID。

  • 在读取时,一个消费者组中只能有一个消费者实例从一个分区读取数据。

  • 有多个消费者组的情况下,每个组中有一个实例可以从一个分区读取数据。

但是,如果消费者数量超过分区数量,一些消费者就会变成闲置状态。例如,如果一个消费者组中有8个消费者和6个分区,那么将有2个消费者处于闲置状态。

Apache Kafka的架构

发表评论

邮箱地址不会被公开。 必填项已用*标注

× 二 = 十二

滚动到顶部