Apache卡夫卡®是一个分布式流处理平台
流媒体平台有三个关键功能:
发布和订阅记录流,类似于消息队列或企业消息传递系统。
以容错的持久方式存储记录流。
处理发生的记录流。
Kafka通常用于两大类应用程序:
- 构建实时流数据管道,可靠地获取系统或应用程序之间的数据
- 构建转换或响应数据流的实时流应用程序
为了理解卡夫卡是如何实现这些功能的,让我们深入了解并从头开始探索卡夫卡的功能。
首先是几个概念:
- Kafka作为集群运行在一个或多个服务器上,这些服务器可以跨多个数据中心。
- Kafka集群将记录流存储在称为主题的类别中。
- 每个记录由一个键、一个值和一个时间戳组成。
Kafka有四个核心api:
- Producer API 允许应用程序向一个或多个Kafka主题发布记录流.
- Consumer API 允许应用程序订阅一个或多个主题,并处理生成给它们的记录流.
- Streams API 允许应用程序充当流处理器,使用来自一个或多个主题的输入流,并将输出流生成到一个或多个输出主题,从而有效地将输入流转换为输出流.
- Connector API 允许构建和运行将Kafka主题连接到现有应用程序或数据系统的可重用生产者或消费者。例如,连接到关系数据库的连接器可能捕获对表的每个更改.
在Kafka中,客户机和服务器之间的通信是通过一个简单的、高性能的、与语言无关的TCP协议完成的。此协议经过版本控制,并与旧版本保持向后兼容性。我们为Kafka提供了一个Java客户机,但是客户机可以使用多种语言。
Topics and Logs
际上,在每个使用者的基础上保留的唯一元数据是该使用者在日志中的偏移量或位置。这个偏移量由使用者控制:通常情况下,使用者在读取记录时将线性地推进其偏移量,但实际上,由于位置由使用者控制,所以它可以按照自己喜欢的任何顺序消费记录。例如,使用者可以重置为旧的偏移量来重新处理来自过去的数据,或者跳到分布在Kafka集群中的服务器上的大多数日志分区,每个服务器处理数据和对分区共享的请求。为了容错,每个分区在可配置数量的服务器之间复制。
让我们首先深入了解Kafka为记录流提供的核心抽象—主题。
主题是发布记录的类别或提要名称。Kafka中的主题通常是多订阅者的;也就是说,主题可以有0个、1个或多个订阅写入主题的数据的使用者。
对于每个主题,Kafka集群都维护一个分区日志,如下所示
每个分区都是一个有序的、不可变的记录序列,这些记录不断地添加到结构化提交日志中。每个分区中的记录都被分配一个顺序的id号,称为惟一标识分区中的每个记录的偏移量。
Kafka集群使用一个可配置的保留期持久地保存所有已发布的记录(不管它们是否已被消耗)。例如,如果保留策略设置为2天,那么在发布记录后的2天内,记录是可用的,在此之后将丢弃记录以释放空间。Kafka的性能在数据大小方面实际上是恒定的,因此长时间存储数据不是问题。
实际上,在每个使用者的基础上保留的唯一元数据是该使用者在日志中的偏移量或位置。这个偏移量由使用者控制:通常情况下,使用者在读取记录时将线性地推进其偏移量,但实际上,由于位置由使用者控制,所以它可以按照自己喜欢的任何顺序消费记录。例如,使用者可以重置到旧的偏移量来重新处理过去的数据,或者跳到最近的记录并从“现在”开始消费。
这些特性的组合意味着Kafka的消费者非常便宜——他们来来去去不会对集群或其他消费者造成太大影响。例如,您可以使用我们的命令行工具“跟踪”任何主题的内容,而不更改任何现有使用者使用的内容。
日志中的分区有几个用途。首先,它们允许日志扩展到超出单个服务器的大小。每个单独的分区必须适合承载它的服务器,但是主题可能有多个分区,因此可以处理任意数量的数据