Apache Kafka是一个事件流平台,其结合了三个关键的功能,使你可以完成端到端的事件流解决方案。
- 发布(写)和订阅(读)事件流,包括从其他系统连续导入/导出数据。
- 事件流存储具有持久性和可靠性。
- 可以处理当前时刻或者以往的事件流。
所有这些功能都是以分布式、高度可伸缩、弹性、容错和安全的方式提供的。Kafka是一个分布式系统,由服务端和客户端组成,通过高性能的TCP网络协议进行通信。Kafka可以部署在裸金属硬件、虚拟机和容器上,也可以部署在云上。您可以选择自管理您的Kafka环境和使用由各种供应商提供的完全管理的服务。
服务端:
服务端:Kafka作为一个集群运行一个或多个服务器,可以跨越多个数据中心或云区域。其中一些服务器构成存储层,称为brokers。其他服务器运行Kafka Connect来持续导入和导出数据作为事件流,将Kafka与您现有的系统集成,如关系数据库以及其他Kafka集群。为了让你实现关键任务的用例,Kafka集群具有高度的可扩展性和容错性:如果它的任何一个服务器发生故障,其他服务器将接管它们的工作,以确保持续的操作而不丢失任何数据。
客户端:它们允许您编写分布式应用程序和微服务,这些应用程序和微服务可以并行地、大规模地读取、写入和处理事件流,甚至在出现网络问题或机器故障的情况下也可以容错。Kafka附带了一些这样的客户端,这些客户端被Kafka社区提供的几十个客户端增强了:客户端可以用于Java和Scala,包括更高级别的Kafka Streams库,以及用于Go、Python、C/ c++和许多其他编程语言以及REST api。
主要概念和术语
事件记录了在现实世界中或你的企业中“发生了某事”的事实。在文档中也称为记录或消息。当你读或写数据到Kafka时,你以事件的形式做这件事。从概念上讲,事件具有键、值、时间戳和可选的元数据头。下面是一个例子:
- Event key: "Alice"
- Event value: "Made a payment of $200 to Bob"
- Event timestamp: "Jun. 25, 2020 at 2:06 p.m."
生产者是那些向Kafka发布(写)事件的客户端应用程序,而消费者是那些订阅(读和处理)这些事件的应用程序。在Kafka中,生产者和消费者是完全解耦的,彼此是不可知的,这是实现Kafka闻名的高可扩展性的一个关键设计元素。例如,生产者从不需要等待消费者。Kafka提供了各种各样的保证,比如精确处理一次事件的能力。
事件被组织并持久地存储在主题(topics)中。很简单,一个主题类似于文件系统中的一个文件夹,事件就是该文件夹中的文件。一个示例主题名称可以是“payments”。Kafka中的主题总是多生产者和多订阅者:一个主题可以有0个、1个或多个生产者向它写入事件,也可以有0个、1个或多个消费者订阅这些事件。主题中的事件可以根据需要经常读取——与传统消息传递系统不同,事件在使用后不会删除。相反,你可以通过每个主题的配置设置来定义Kafka应该保留你的事件多长时间,之后旧的事件将被丢弃。Kafka的性能相对于数据大小来说是不变的,所以长时间存储数据是完全可以的。
主题是分区的,这意味着一个主题分散在位于不同Kafka broker上的多个“桶”上。这种数据的分布式位置对于可伸缩性非常重要,因为它允许客户机应用程序同时从/向多个代理读取和写入数据。当一个新事件被发布到一个主题时,它实际上被附加到主题的一个分区中。具有相同事件键(例如,客户或车辆ID)的事件被写入同一个分区,Kafka保证任何给定主题分区的消费者都将始终以写入的完全相同的顺序读取该分区的事件。
image图中这个示例主题有四个分区P1-P4。两个不同的生产者客户端通过网络向主题的分区写入事件,从而彼此独立地向主题发布新事件。具有相同键的事件(图中通过它们的颜色表示)被写入同一个分区。注意,如果合适的话,两个生产者都可以写入同一个分区。
为了保证你的数据具有容错性和高可用性,每一个主题可以被复制,甚至跨geo-regions或数据中心,这样总有多个brokers有一份数据以防出错等等。一个常见的生产设置是复制因子3,也就是说,您的数据总是有三个副本。这个复制是在主题分区级别执行的。
这篇入门文章应该足够作介绍了。如果你感兴趣的话,文档的设计部分详细地解释了Kafka的各种概念。
Kafka APIs
除了用于管理和管理任务的命令行工具,Kafka还有5个用于Java和Scala的核心api:
- 管理和检查主题、brokers和其他Kafka对象的Admin API。
- Producer API发布(写)事件流到一个或多个Kafka主题。
- Consumer API用于订阅(读取)一个或多个主题,并处理生成给它们的事件流。
- Kafka Streams API实现流处理应用和微服务。它提供了处理事件流的高级函数,包括转换、聚合和连接等有状态操作、窗口、基于事件时间的处理等等。从一个或多个主题读取输入,以生成对一个或多个主题的输出,有效地将输入流转换为输出流。
- Kafka Connect API用于构建和运行可重用的数据导入/导出连接器,这些连接器消费(读)或产生(写)外部系统和应用的事件流,以便它们能够与Kafka集成。例如,到关系数据库(如PostgreSQL)的连接器可能捕获对一组表的每一个更改。然而,在实践中,你通常不需要实现自己的连接器,因为Kafka社区已经提供了数百个随时可用的连接器。
网友评论