kafka介绍

2021/08/05

10分钟了解kafka

什么是事件流?

事件流是相当于人体中枢神经系统的数字系统。它是“永远在线”世界的技术基础,在这个世界里,企业越来越多地由软件定义和自动化,软件的用户也更多地是软件。 通常讲,事件流实时捕获来自像数据库、传感器、移动设备、云服务和软件应用形式的事件流;持久的存储这些事件流供后续检索、操作、处理,实时和回顾性地对事件流做出反应;路由事件流到不同技术的目的地。因此,事件流确保了数据的连续流动和解释,从而使正确的信息在正确的地点、正确的时间出现。

能够使用事件流做什么?

事件流是应用到wide variety of use cases 跨越过多的行业和组织。它的许多例子包括:

  • 为了实时处理支付和金融交易,例如在证券交易所、银行和保险业。
  • 实时跟踪和监控汽车、卡车、车队和运输,如物流和汽车行业。
  • 持续捕获和分析来自IoT设备或其他设备的传感器数据,如工厂和风电场
  • 收集并立即响应客户的互动和订单,如零售、酒店和旅游行业,以及移动应用程序。
  • 监测住院病人,预测病情变化,确保在紧急情况下及时治疗。
  • 连接、存储公司不同部门产生的数据并使其可用。
  • 作为数据平台、事件驱动架构和微服务的基础。

    Apache Kafka®是一个事件流平台。这是什么意思?

    Kafka包含三个关键的能力,所以你可以用一个经过生产测试的解决方案来实现端到端事件流的用例:

  • 发布(write)和订阅(read)事件流,包括从其他系统持续的导出/导入你的数据。
  • 持久性和可靠地存储事件流,只要你想要。
  • 在事件发生或回顾时处理事件流。 所有的这些功能在分布式系统是提供的,高可扩展,易伸缩,容错,和安全的方式。Kafka可以部署在裸金属硬件上,虚拟机,容器,在本地和云端。您可以选择自管理您的Kafka环境和使用由各种供应商提供的完全管理的服务。供应商的如(腾讯的CKafka)

    Kafka是怎么样工作的

    Kafka是一个分布式系统,由服务器和客户端组成,通过高性能的TCP网络协议进行通信。它可以部署在裸金属硬件、虚拟机和内部环境中的容器上,也可以部署在云环境中。

服务端: Kafka是作为一个集群运行的一个或多个服务器,可以跨越多个数据中心或云区域。 其中一些服务器构成存储层,称为brokers。 其他服务器运行Kafka Connect来持续导入和导出数据作为事件流,将Kafka与您现有的系统集成,如关系数据库以及其他Kafka集群。为了让你实现关键任务的用例,Kafka集群具有高度的可扩展性和容错性:如果它的任何一个服务器发生故障,其他服务器将接管它们的工作,以确保持续的操作而不丢失任何数据。

客户端:它们允许您编写分布式应用程序和微服务,这些应用程序和微服务以并行、大规模和容错的方式读取、写入和处理事件流,即使在出现网络问题或机器故障的情况下也是如此。Kafka附带了一些这样的客户端,这些客户端被Kafka社区提供的几十个客户端增强了:客户端可以用于Java和Scala,包括更高级别的Kafka Streams库,用于Go、Python、C/ c++和许多其他编程语言以及REST api。

主要概念和术语

一个event记录了在世界上或你的业务中“发生了某事”的事实。在文档中也称为记录或消息。当你读写Kafka的数据时,你以事件的形式做这件事。 从概念上讲,event具有key、value、timestamp和可选的元数据头。下面是一个例子:

  • Event key: “Alice”
  • Event value: “Made a payment of $200 to Bob”
  • Event timestamp: “Jun. 25, 2020 at 2:06 p.m.”

生产者(Producers)是那些向Kafka发布(写)事件的客户端应用程序, 消费者(consumers)是订阅(读取和处理)这些事件的人。在Kafka, 生产者和消费者完全分离,彼此不可知。这是实现Kafka闻名的高可扩展性的一个关键设计元素。例如,生产者永远不需要等待消费者。Kafka提供了各种各样的保障,比如精确的处理一次事件的能力。

事件被组织并持久地存储在topics中。非常简单,topic类似于文件系统中的文件夹,事件就是那个文件夹里的文件。一个例子topic命名为“payments”,Topics在Kafka中总是多生产者和多消费者:一个topic能够有零个,一个,或多个生产者写事件到它,也有零个,一个,或多个消费者订阅这些事件。 与传统的消息传递系统不同,topic中的事件可以根据需要经常读取,事件在消费后不会被删除。相反,你可以通过每个主题的配置设置来定义Kafka应该保留你的事件多长时间,之后旧的事件将被丢弃(过期地)。 Kafka的性能相对于数据大小来说是不变的,所以长时间存储数据是完全可以的。

Topics 是分区(partitioned), 这意味着一个topic被分散在多个位于不同Kafka broker上的“桶”上。这种数据的分布式位置对于可伸缩性非常重要,因为它允许客户机应用程序同时从/向多个brokers读取和写入数据。当一个新的事件发布到topic,它实际附加到topic的一个分区,相同的事件key(例如:一个消费者,车辆ID)是写到同一个分区, Kafka保证任何给定主题分区的消费者都将始终按照写入的顺序读取该分区的事件。

streams-and-tables-p1_p4

上图:这个topic有四个分区P1-P4,两个不同的生产者客户端是独立的发布,新的事件是通过网络写到topic的分区上, 具有相同键的事件(图中通过它们的颜色表示)被写入同一个分区。 注意,如果合适的话,两个生产者都可以写入同一个分区。

为了使数据容错和高可用性,每个topic是有副本, 即使跨越地理区域或数据中心,,所以总是有多个brokers拥有数据的副本,以防出错,你想要对brokers做维护,等等。一个个常见的生产设置是复制因子3,也就是说,您的数据总是有三个副本。这个副本是在topic-partitioned级别执行的。 这篇入门文章应该足够作介绍了。如果你感兴趣的话,文档的···部分详细地解释了Kafka的各种概念。