1 前言
Apache Kafka是目前最流行的、开源的、分布式的、流式消息或者事件处理软件系统,其主要用于大规模的数据采集、数据集成、数据处理、数据存储以及数据分析领域,其具备的关键特性包括高性能、低延迟、容错性以及高吞吐量,这些关键的特性支持Kafka集群每秒能处理海量的消息或事件。以下首先简要描述流式事件的基本概念。
1.1 流式事件
理论上,事件流式处理等同于人类身体的中央神经系统的数字化,使用持续不断的事件流以及对事件流的处理技术确保系统处于永远在线的状态,并且能让系统中的业务以软件定义或者自动化的方式持续地增长。
技术上,事件流式处理是指从事件源中实时地捕获数据,其中这些事件源包括来自数据库、传感器、移动设备、云服务或者软件应用的事件流,也可以持久化地存储这些事件流并用作延迟获取再处理,也可以实时地或者回顾地对事件流执行控制、处理或者响应,也可以路由这些事件流到其他需要实现不同技术目标的地方。最终,使用流式处理机制,保证了事件在正确的时刻到达正确的地方。
1.2 使用场景
目前,事件流式处理技术被广泛地运用于各种不同的工业领域或者企业组织的生产系统中,以下简要列举一些相关的使用场景:
|
1.3 平台能力
Apache Kafka作为事件流式处理的平台,其提供以下三个关键的平台能力支持端到端的基于流式事件的数据处理模式,如下所示:
|
以上提供的三个基础能力满足分布式集群、高可扩展性、弹性可伸缩、容错性以及安全性。Apache Kafka的部署环境包括裸物理机、虚拟机、容器以及私有云或者公有云。用户可以使用Kafka提供的客户端命令行工具自行管理Kafka运行环境或者使用来自其他供应商提供的集成管理平台。
1.4 工作原理
Kafka是一个分布式系统,其中包括服务器端组件以及客户端组件,两端的组件之间使用高性能的TCP协议框架交互消息。
服务器端 |
Kafka是以服务器端集群的方式运行,集群可包括一个或者多个服务器端节点,这些服务器端节点支持跨越多个数据中心或者多个云区域,部署在这些服务器端节点的存储层的组件被称之为broker,其他组件Kafka Connect是连接当前Kafka集群与其他数据存储系统或者其他Kafka集群并提供事件流的导入与导出功能。此外,Kafka集群提供高可扩展性以及高可容错性支持以上使用场景中的关键任务:假如任何一个服务器端节点或者组件失败,则Kafka运用失败转移的策略使用其他服务器端节点接替失败节点的全部工作,该机制确保没有任何数据丢失的情况下持续不断地对外提供服务。 |
客户端 |
Kafka提供支持不同语言类型(例如Java、C/C++以及其他)的客户端工具,用户可以使用这些客户端工具开发分布式应用或者微服务用于发布或者消费事件流,这些应用或者微服务支持事件流并行处理、大规模可扩展、网络连接失败或者机器故障相关错误类型的容错性。 |
1.5 工程理论
理论上,一个事件记录来自现实世界或者业务系统中的事实,也被称之为消息或者记录,在Kafka系统中是以事件为单元写入或者读出数据,每个事件都包括一些基本的信息,其中包括必选的键值、时间戳以及其他可选的元数据信息,举例如下所示:
Event key: "Alice" Event value: "Made a payment of $200 to Bob" Event timestamp: "Jun. 25, 2020 at 2:06 p.m." |
事件生产者(producers)负责发布事件(写入)到事件流,事件消费者(consumers)负责从事件流中消费事件(读出并处理)。在Kafka系统中,事件生产者与事件消费者完全解耦,两者之间没有固定的映射关系,这种关键的设计方式确保Kafka系统能具备高可扩展性,例如,事件生产者不需要等待事件消费者,Kafka提供机制确保事件仅且只被消费一次(后续将描述其他消费机制)。
Kafka系统中的所有事件是持久化地存储在主题(topics)中,每个主题类似于文件系统中的一个文件夹,所有的事件存储在主题文件夹内的文件中,每个主题可以对应多个事件生产者与多个消费者,也就是,支持0个、1个、多个生产者向主题发布事件,支持0个、1个、多个消费者向主题订阅事件用于消费。主题中的事件可以按照用户设定的频率重复消费与处理,事件流式处理系统不同于传统的消息处理系统,事件是持久化地存储在Kafka中的,事件被消费完成后不会被删除,用户可以根据业务需求设定主题内事件持久化存储的延续时间或者以某个时刻的事件为参照。目前,Kafka的性能不受数据规模的影响,其性能高效而且接近常数。
Kafka的主题支持分区存储,也就是,一个主题可以跨越多个不同的broker节点以桶加载的方式分片地(每个分区即每片)存储使用,该分片式与分布式的设计能满足高可扩展性,也为客户端的应用提供高性能的、高并发的方式同时从多个broker的多个分片中读写事件流。当一个事件被发布到Kafka系统中,该事件实际上是按照事件键的规则存储到主题其中的一个分片中,相同键的事件都存储在主题的相同分片中,Kafka提供机制保证任何分片的任何事件消费者都是按照主题事件的写入顺序读取。如下所示提供主题事件的写入模型:
如上图所示,其中事件消费者Producer client 1与Producer client 2根据事件的键值写入事件到相应的主题分片中。
如前面所述,Kafka为了满足集群高可用性,使用主题多副本复制的策略,该策略支持跨地理区域或者跨数据中心的副本复制。因此,在Kafka集群中,有些broker仅用作副本备份,在数据失败时执行副本恢复的策略。Kafka副本复制策略的颗粒度是主题的分片,默认值是3个副本,用户可以设置调整该值。
(未完待续)