简介
Apache Kafka 是一个分布式流处理平台。它能够
- 发布和订阅数据流
- 持久化数据流
- 处理数据流
其广泛应用于:
- 构建实时流数据管道,在系统或应用程序之间可靠地获取数据。
- 构建实时流应用程序以转换或响应数据流。
Kafka 作为一个集群运行在一个或多个可以跨越多个数据中心的服务器上。Kafka 集群将数据流存储在称为主题的类别中。每条记录由一个键、一个值和一个时间戳组成。
Kafka 有以下核心 API:
- Producer 生产者: 应用程序可以将数据流发布到一个或多个Kafka主题。
- Consumer 消费者: 应用程序可以订阅主题并处理为它们生成的数据流。
- Streaming 流:应用程序可以充当流处理器,使用来自一个或多个主题的输入流并将输出流生成到一个或多个输出主题,从而有效地将输入流转换为输出流。
- Connector 连接器: 构建和运行可重用的生产者或消费者,将Kafka主题连接到现有应用程序或数据系统。例如,关系数据库的连接器可能会捕获对表的每次更改。
在Kafka中,客户端和服务器之间的通信是通过一个简单、高性能、独立于特定语言的TCP 协议完成的。该协议是版本化的,并保持与旧版本的向后兼容性。因此,Kafka提供多语言客户端。
主题和日志
Kafka的核心概念是主题。主题是发布数据流的类别名称。Kafka主题支持多订阅。这意味着一个主题可以有零个,一个或者多个消费者订阅。 对于每个主题,Kafka集群维护一个分区日志,如下所示: 每个分区都是一个有序的、不可变的记录序列,不断地附加到结构化的提交日志中。每个分区中的记录都分配有一个品偏移量序号,它唯一地标识分区中的每个记录。 Kafka集群持久地保存所有已发布的记录,无论它们是否已经被消费者读取。对于某个主题,Kafka支持设置过期时间。比如,如果过期时间设置为两天,则在记录发布后的两天内,它可以使用。超过两天的记录会被丢弃以释放空间。请注意,过期时间不会影响Kafka读取性能,其仅仅影响存储空间。 对于消费者而言,每个消费者保留的唯一元数据是该消费者在日志中的偏移量或位置。这个偏移量是由消费者控制的。通常,消费者在读取记录时会线性增加其偏移量,但是,因为位置由消费者控制,它可以以任何顺序消费记录。例如,消费者可以重置为较旧的偏移量以重新处理过去的数据或跳到最近的记录并从“现在”开始消费。 这种特性组合意味着Kafka消费者可以来去匆匆,而不会对集群或其他消费者产生太大影响。例如,您可以使用命令行工具来“跟踪”任何主题的内容,而无需更改其他消费者使用的内容。打一个比较有意思的比喻:在Kakfa有点像我们小学时候的黑板报,只是它只能写入,不能擦除。生产者像是不断往黑板报上写入内容的写手,而消费者像是不断看内容的看客。
分区
日志分布在Kafka集群中的服务器上,每个服务器处理数据和请求分区共享。每个分区都在可配置数量的服务器上复制以实现容错。 每个分区都有一个充当“领导者”的服务器和零个或多个充当“跟随者”的服务器。领导者处理分区的所有读写请求,而追随者被动地复制领导者。如果领导者失败,其中一个追随者将自动成为新的领导者。每个服务器充当其某些分区的领导者和其他分区的追随者,以便在集群内成功平衡负载。 生产者将数据发布到他们选择的主题。生产者负责选择将哪条记录分配给主题中的哪个分区。这可以为负载平衡以循环方式完成,也可以根据某些语义分区函数(例如,基于记录中的某个键)来完成。 消费者使用消费者组名称标记自己,并且发布到主题的每条记录都被传递到每个订阅消费者组中的一个消费者实例。消费者实例可以位于不同的进程或不同的机器上。如果所有消费者实例都具有相同的消费者组,那么记录将有效地在消费者实例上进行负载平衡。如果所有的消费者实例都有不同的消费者组,那么每条记录都会被广播到所有的消费者进程。 Kafka仅保证分区内记录的顺序,而不是主题中不同分区之间的顺序。理由很简单,某一个消费者仅储存当前订阅分区的偏移量。对于大多数应用程序而言,这已经能够满足需求了。但是,如果您需要某一主题严格保证顺序,这可以通过只有一个分区的主题来实现,尽管这意味着每个消费者组只有一个消费者进程。总结来说Kafka提供以下顺序保证:
- 生产者发送到特定主题分区的消息按发送顺序附加。例如,如果记录 M1 与记录 M2 由同一生产者发送,并且 M1 先发送,则 M1 的偏移量将低于 M2,并且出现在日志中的更早。
- 消费者实例按照记录在日志中的存储顺序查看记录。
接下来,我们会更加深入谈到Kafka原理,并附加应用实例。