一、概述

Kafka是由LinkedIn公司采用Scala语言开发的一个多分区、多副本且基于ZooKeeper协调的分布式消息系统,现已被捐献给Apache基金会。
Kafka可以跨越多个数据中心,在一个或多个服务器上以集群的方式运行,其将记录流存储在称为topic的类别中,每个记录由一个键,一个值和一个时间戳组成。

二、基本概念

一个典型的 Kafka 体系架构包括若干 Producer、若干 Broker、若干 Consumer,以及一个ZooKeeper集群。

kafka 一个 topic 可以设置多少个 partition kafka有多少个topic_数据

1. Topic和Partition

kafka 一个 topic 可以设置多少个 partition kafka有多少个topic_数据_02


Kafka中的消息以 主题(Topic) 为单位进行归类,主题是将记录发布到的类别或订阅源名称。Kafka中的主题始终是多用户的;也就是说,一个主题可以有零个,一个或多个消费者来订阅写入该主题的数据。

对于每个主题,Kafka集群都会维护一个 分区(Partition) 日志,每个分区都是有序的,不变的记录序列,这些记录连续地附加到结构化的提交日志中。每个分区中的记录都分配有一个称为 偏移量(offset ) 的顺序ID号,该ID 唯一地标识分区中的每个记录。

基于每个消费者保留的唯一元数据是该消费者在日志中的偏移量或位置,使用者在读取记录时会线性地推进其偏移量,但是实际上,由于位置是由使用者控制的,因此它可以按喜欢的任何顺序使用记录。所以,我们可以重置到较旧的偏移量以重新处理过去的数据,或者跳到最近的记录开始消费。

2. Producer(生产者)

Kafka的生产者负责创建消息,然后将其投递到他们选择的Topic中。生产者负责选择将哪个记录分配给主题中的哪个分区。可以以循环方式完成此操作,仅是为了平衡负载,也可以根据某些语义分区功能(例如基于记录中的某些键)进行此操作。

3. Consumer(消费者)

消费者,也就是接收消息的一方。消费者连接到Kafka上并接收消息,进而进行相应的业务逻辑处理。

消费者使用消费者组(consumer group) 名称标记自己,并且发布到主题的每条记录都会传递到每个订阅消费者组中的一个消费者实例。使用者实例可以在单独的进程中或在单独的机器上。

kafka 一个 topic 可以设置多少个 partition kafka有多少个topic_服务器_03


如上图所示,如果所有使用者实例都具有相同的使用者组(如C1和C2),那么将在这些使用者实例上有效地平衡记录,均衡的消费分区(Partition)的日志。

如果所有使用者实例具有不同的使用者组(如C1和C3),则每条记录将广播到所有使用者进程。

4. Broker(服务代理节点)

对于Kafka而言,Broker可以简单地看作一个独立的Kafka服务节点或Kafka服务实例。大多数情况下也可以将Broker看作一台Kafka服务器,前提是这台服务器上只部署了一个Kafka实例。一个或多个Broker组成了一个Kafka集群。

三、核心API

Kafka主要存在五个核心的API:

kafka 一个 topic 可以设置多少个 partition kafka有多少个topic_服务器_04

  1. Producer API允许应用程序发布记录流至一个或多个Kafka的Topic
  2. Consumer API允许应用程序订阅一个或多个Topic,并处理他们所产生的记录数据
  3. Streams API允许应用程序充当流处理器,从一个或多个Topic消耗输入的数据流,并产生一个输出流至一个或多个输出的主题,有效地将输入流转化为输出流
  4. Connector API允许构建和运行可重复使用的生产者或消费者将Kafka主题与现有的应用程序或数据系统相连接。例如,关系数据库的连接器可能会捕获对表的所有更改。
  5. Admin API允许管理和检查的Topic,Broker和其他Kafka对象

四、使用场景

1. Kafka作为消息传递系统

Kafka兼有队列和发布-订阅两种消息传递模式:
一个消费组中的消费者可以划分为一组使用者,符合队列的特性,一组使用者可以从服务器读取数据,并且每个分区只会由其中一个使用者消费。确保使用者是该分区的唯一读取器,并按顺序使用数据。由于存在许多分区,因此仍然可以平衡许多使用者实例上的负载。
多个消费者组又与发布订阅一样,Kafka将消息广播到多个消费者组,每个消费组互不影响,各自消费全量的数据。

2. Kafka作为存储系统

我们可以将Kafka视为一种专用于高性能,低延迟提交日志存储,复制和传播的专用分布式文件系统。
写入Kafka的数据将写入磁盘并进行复制以实现容错功能。Kafka允许生产者等待确认,以便直到完全复制并确保即使写入失败的服务器也可以保留写入,写入才被认为是完整的。
我们可以把Kafka作为长期的数据存储系统来使用,只需要把对应的数据保留策略设置为“永久”或启用主题的日志压缩功能即可。

3. Kafka作为流式处理平台

Kafka 不仅为每个流行的流式处理框架提供了可靠的数据来源,还提供了一个完整的流式处理类库,比如窗口、连接、变换和聚合等各类操作。它使用生产者和使用者API作为输入,使用Kafka进行状态存储,并使用相同的组机制来实现流处理器实例之间的容错。