Kafka
流媒体平台有三个关键功能:
- 发布和订阅记录流,类似于消息队列或企业消息传递系统。
- 以容错的持久方式存储记录流。
- 记录发生时处理流。
Kafka通常用于两大类应用:
- 构建可在系统或应用程序之间可靠获取数据的实时流数据管道。
- 构建转换或响应数据流的实时流应用程序。
下面介绍几个概念:
- Kafka作为一个集群运行在一个或多个可以跨多个数据中心的服务器上。
- Kafka集群以称为主题的类别存储记录流。
- 每条记录都包含一个键,一个值和一个时间戳。
Kafka有四个核心APIs:
- Producer API:允许应用程序将记录流发布到一个或多个Kafka主题。
- Consumer API:允许应用程序订阅一个或多个主题并处理为其生成的记录流。
- Streams API:使应用程序充当流处理器,使用来自一个或多个主题的输入流并产生到一个或多个输出主题的输出流,从而有效地将输入流转换为输出流。
- Connector API:允许构建和运行将Kafka主题连接到现有应用程序或数据系统的可重用生产者或使用者。 例如,关系数据库的连接器可能捕获对表的每个更改。
Topics 和 Logs
我们首先学习Kafka为记录流提供的核心抽象 - 主题。
主题是发布记录的类别或订阅源名称。 Kafka的主题总是多用户; 也就是说,一个主题可以有零个,一个或多个消费者订阅写入它的数据。
对于每个主题,Kafka群集都维护一个如下所示的分区日志:
每个分区都是一个有序的,不可变的记录序列,不断附加到结构化的提交日志中。 分区中的记录每个都分配了一个称为偏移的顺序ID号,它唯一地标识分区中的每个记录。
Kafka集群持久保存所有已发布的记录 - 无论是否已使用 - 使用可配置的保留期。 例如,如果保留策略设置为两天,则在发布记录后的两天内,它可供使用,之后将被丢弃以释放空间。 Kafka的性能在数据大小方面实际上是恒定的,因此长时间存储数据不是问题。
实际上,基于每个消费者保留的唯一元数据是该消费者在日志中的偏移或位置。 这种偏移由消费者控制:通常消费者在读取记录时会线性地提高其偏移量,但事实上,由于该位置由消费者控制,因此它可以按照自己喜欢的任何顺序消费记录。 例如,消费者可以重置为较旧的偏移量来重新处理过去的数据,或者跳到最近的记录并从“现在”开始消费。
这些功能组合意味着Kafka消费者非常方便 - 他们可以来来往往对集群或其他消费者没有太大影响。 例如,您可以使用我们的命令行工具“拖尾”任何主题的内容,而无需更改任何现有使用者所消耗的内容。
日志中的分区有多种用途。 首先,它们允许日志扩展到超出适合单个服务器的大小。 每个单独的分区必须适合托管它的服务器,但主题可能有许多分区,因此它可以处理任意数量的数据。 其次,它们充当了并行性的单位 - 更多的是它。
分配
日志的分区分布在Kafka集群中的服务器上,每个服务器处理数据并请求分区的共享。 每个分区都在可配置数量的服务器上进行复制,以实现容错。
每个分区都有一个服务器充当“领导者”,零个或多个服务器充当“追随者”。 领导者处理分区的所有读取和写入请求,而追随者被动地复制领导者。 如果领导者失败,其中一个追随者将自动成为新的领导者。 每个服务器都充当其某些分区的领导者和其他服务器的追随者,因此负载在群集中得到很好的平衡。
Producers
生产者将数据发布到他们选择的主题。 生产者负责选择分配给主题中哪个分区的记录。 这可以以循环方式完成,仅仅是为了平衡负载,或者可以根据一些语义分区功能(例如基于记录中的某些键)来完成。 更多关于在一秒钟内使用分区的信息!
Consumers
消费者使用消费者组名称标记自己,并且发布到主题的每个记录被传递到每个订阅消费者组中的一个消费者实例。 消费者实例可以在单独的进程中或在不同的机器上。
如果所有消费者实例具有相同的消费者组,则记录将有效地在消费者实例上进行负载平衡。
如果所有消费者实例具有不同的消费者组,则每个记录将广播到所有消费者进程。
两个服务器Kafka群集,托管四个分区(P0-P3),包含两个使用者组。消费者组A有两个消费者实例,B组有四个消费者实例。
然而,更常见的是,我们发现主题具有少量的消费者群体,每个“逻辑订户”一个。每个组由许多用于可伸缩性和容错的消费者实例组成。这只不过是发布 - 订阅语义,其中订阅者是消费者群集而不是单个进程。
在Kafka中实现消费的方式是通过在消费者实例上划分日志中的分区,以便每个实例在任何时间点都是分配的“公平份额”的独占消费者。维护组中成员资格的过程由Kafka协议动态处理。如果新实例加入该组,他们将从该组的其他成员接管一些分区;如果实例死亡,其分区将分发给其余实例。
Kafka仅提供分区内记录的总订单,而不是主题中不同分区之间的记录。对于大多数应用程序而言,按分区排序与按键分区数据的能力相结合就足够了。但是,如果您需要对记录进行总订单,则可以使用仅包含一个分区的主题来实现,但这将意味着每个使用者组只有一个使用者进程。