Apache Kafka是一种分布式事件存储和流处理平台。该项目旨在提供一个统一的、高吞吐量、低延迟的平台,用于处理实时数据流。
•Kafka可以通过Kafka Connect连接到外部系统(用于数据导入/导出),并提供Kafka Streams库用于流处理应用程序。•它有许多用例,包括分布式日志记录、流处理、数据集成和发布/订阅消息传递。•Kafka是一个数据流系统,允许开发人员实时响应新事件的发生。•Kafka的架构由存储层和计算层组成。存储层旨在高效存储数据,并且是一个分布式系统,如果存储需求随时间增长,可以轻松地扩展系统以适应增长。
计算层由四个核心组件组成:
1.生产者(Producer)2.消费者(Consumer)3.流处理(Streams)4.连接器(Connectors)API,使得Kafka可以在分布式系统中扩展应用程序。
1. 生产者和消费者API: Kafka强大的应用程序层的基础是用于访问存储的两个基本API,即用于写入事件的生产者API和用于读取事件的消费者API。在这两个API之上构建了用于集成和处理的API。
2. Kafka Connect: Kafka Connect建立在生产者和消费者API之上,提供了一种将数据在Kafka和外部系统之间集成的简单方法。源连接器从外部系统中获取数据并将其发送到Kafka主题。接收器连接器从Kafka主题获取数据并将其写入外部系统。
3. Kafka Streams: 用于处理到达的事件的Kafka Streams是一个Java库,建立在生产者和消费者API之上。Kafka Streams允许您执行实时流处理、强大的转换和事件数据的聚合。
基本概念
消息(Message)
•消息是信息的记录。每条消息都有一个可选的键,用于将消息路由到适当的分区,以及必需的值,即实际的信息。消息的键和值都是字节数组。
Kafka主题(Kafka Topics)
•主题是事件的日志。•Apache Kafka的最基本的组织单元是主题,类似于关系数据库中的表。•您可以创建不同的主题来保存不同类型的事件,并创建不同的主题来保存过滤和转换后的同一类型的事件。
重要属性:
•首先,它们是追加写入的:当您将新消息写入日志时,它总是追加到末尾。•其次,它们只能通过在日志中寻找任意偏移量来进行读取,然后按顺序扫描日志条目进行读取。•第三,日志中的事件是不可变的 - 一旦某件事发生,几乎不可能撤消它。•日志本质上也是持久的。传统的企业消息系统具有主题和队列,用于临时存储消息以在源和目标之间进行缓冲。•每个主题可以配置为在达到一定年龄后过期数据。
Kafka分区(Kafka Partitioning)
•为了在主题中分布事件的存储和处理,Kafka使用分区的概念。一个主题由一个或多个分区组成,这些分区可以存在于Kafka集群中的不同节点上。•分区是Kafka事件的主要存储单元,尽管在分层存储(Tiered Storage)中,一些事件存储被移出了分区。•分区也是并行处理的主要单元。可以通过同时写入多
个分区来并行地将事件写入主题。
•同样,消费者可以通过每个消费者实例从不同的分区读取,将其工作负载分散开来。如果只使用一个分区,只能有效地使用一个消费者实例。
分区工作原理:
•将主题分割为分区后,我们需要一种方法来决定将消息写入哪个分区。通常情况下,如果消息没有键,则后续消息将循环分布在主题的所有分区中。•例如,如果您正在生成与同一客户关联的所有事件,使用客户ID作为键可以确保来自给定客户的所有事件始终按顺序到达。
Kafka Broker
•从物理基础设施的角度来看,Apache Kafka由一组称为Broker的机器网络组成。•它们是独立的机器,每台机器上运行一个Kafka broker进程。•每个Broker托管一些分区并处理将新事件写入这些分区或从这些分区读取事件的传入请求。Broker还处理分区之间的复制。
集群(Cluster)
•Broker作为集群的一部分运行,共享负载并提供容错能力。
偏移量(Offset)
•每条消息通过主题、所属分区和偏移量号唯一标识。偏移量是一个不断递增的整数,以唯一地标识消息在给定主题和分区中。在分区内,消息按偏移量号进行排序。
复制(Replication)
•数据复制是Kafka的一个关键功能,它使得Kafka能够提供高持久性和可用性。我们可以在主题级别启用复制。•创建新主题时,可以指定复制因子,然后该主题的每个分区将被多次复制。•这个数字被称为复制因子。使用复制因子N,通常情况下,我们可以容忍N-1个故障,而不会丢失数据,并保持可用性。•每次读写到分区时,都经过主分区(leader)。•只有当所有同步副本将消息写入其预写日志时,消息才被视为已提交。•生产者可以单独配置确认策略。
Kafka生产者(Producers)
•生产者库的API界面相当轻量级:在Java中,有一个称为KafkaProducer的类,您可以使用它连接到集群。•从表面上看,这是与生产消息有关的所有API界面。在幕后,该库管理连接池、网络缓冲区、等待代理确认消息、在必要时重新传输消息等一系列细节,应用程序程序员不需要关心这些细节。
消费者(Consumers)
•使用消费者API与生产者类似。您使用一个称为KafkaConsumer的类来连接到集群。•首先,Kafka与传统消息队列不同之处在于读取消息不会将其销毁;•实际上,在Kafka中,许多消费者从一个主题中读取是很正常的。
Kafka Connect
•一方面,Kafka Connect是一种可插拔连接器的生态系统,另一方面,它是一个客户端应用程序。作为客户端应用程序,Connect是一个在与Kafka brokers独立的硬件上运行的服务器进程。
Kafka Streams
•Kafka Streams是一个Java API,为您提供了对流处理的所有计算原语的便捷访问:过滤、分组、聚合、连接等,使您不必在消费者API之上编写框架代码来执行所有这些操作。•它还提供对由流处理计算产生的可能大量的状态的支持。
流处理中的事件?
•事件是发生的事情的记录,同时提供有关发生的事情的信息。事件的示例包括客户订单、付款、网站上的点击或传感器读数。•事件记录由时间戳、键、值和可选的标头组成。事件有效负载通常存储在值中,键是可选的。
Kafka持久性
•发布的每批消息都存储在分区的活动日志段中,其格式与生产者发布的格式完全相同。消息格式在生产者、消费者和代理之间保持一致,消除了序列化和反序列化的开销。•Kafka使用页面缓存进行读写。所有读取将直接从页面缓存中进行,写入首先应用于页面缓存,然后定期同步。
日志压缩
•Kafka主题的保留策略可以配置为“压缩”或“删除”。删除根据日志保留字节或日志保留时间段清除旧的段文件。•如果将保留策略配置为压缩,Kafka只会保留每个消息键的最新消息。如果
我们正在获取与给定键相关的许多更新,并且只对最新消息感兴趣,这将非常有用。例如,用户更新事件。
领导者选举
•当代理崩溃时,它无法向Zookeeper发送心跳。Zookeeper的会话超时,然后通知集群控制器代理故障的情况。集群控制器获取代理是领导者的所有分区,并选择ISR中的下一个条目并将其提升为领导者。