Apache Kafka数据模型概念简介 - Baeldung


在本教程中,我们将探索使用Apache Kafka进行事件驱动的体系结构的数据建模领域。
在事件驱动系统的数据建模任务之前,我们需要了解一些概念,例如事件,事件流,生产者-消费者和主题。

  • 事件

卡夫卡世界中的事件是业务领域世界中发生的事情的信息日志。它通过将信息记录为键值对消息以及其他一些属性(例如时间戳,元信息和标头)来完成此操作。
  • 消息流/讯息流

Apache Kafka是一种流处理系统,可将事件捕获为消息流。通常,使用传统的表模式存储对象的最新静态状态。
另一方面,事件流可以帮助我们以事件的形式捕获两个连续状态之间的动态变化。如果我们播放一系列这些不可变的事件,我们可以从一个状态过渡到另一个状态。这就是事件流和传统表之间的关系,通常称为流表对偶stream table duality。
  • 主题topic

下面看看如何通过Apache Kafka路由对消息进行分类。
在诸如Apache Kafka之类的消息传递系统中,任何产生事件的事件通常称为生产者。那些阅读和消费这些消息的人称为消费者。
在现实世界中,每个生产者可以生成不同类型的事件,因此,如果我们希望他们过滤与他们相关的消息并忽略其余消息,那么这将浪费大量的精力。
为了解决这个基本问题,Apache Kafka使用的主题本质上是属于在一起的消息组。结果,消费者可以在消费事件消息的同时提高生产力。
让我们看看如何使用分区创建消息的进一步分类并提高整个系统的性能。
我们可以将一个主题划分为多个分区,并调用多个使用者以使用来自不同分区的消息。通过启用这种并发行为,可以提高系统的整体性能。默认情况下,除非在创建主题时明确指定,Kafka会创建主题的单个分区。但是,对于先前存在的主题,我们可以增加分区的数量。
在一个主题内,Kafka使用分区键跨多个分区处理消息。一方面,生产者隐式使用它来将消息路由到分区之一。另一方面,每个使用者都可以从特定分区读取消息。
分区键:默认情况下,生产者将生成键的哈希值,后跟具有分区数的模数。然后,它将消息发送到由计算出的标识符标识的分区。
  • 缩放

我们如何概念化主题和分区对于水平扩展至关重要。一方面,主题更多是数据的预定义分类。另一方面,分区是动态发生的数据动态分类。
此外,在一个主题中我们可以配置多少个分区存在实际限制。这是因为每个分区都映射到代理节点文件系统中的目录。当我们增加分区数量时,我们也增加了操作系统上打开文件句柄的数量。
根据经验,Confluent的专家建议将每个代理的分区数限制为100 x b x r,其中b是Kafka群集中的代理数,r是复制因子。
 
启动Kafka
一个Kafka集群由在Zookeeper集群中注册的多个Kafka代理组成。为了简单起见,我们将使用Confluent发布的现成的Docker映像和docker-compose配置。
首先,让我们下载3节点Kafka集群的docker-compose.yml :
$ BASE_URL="https://raw.githubusercontent.com/confluentinc/cp-docker-images/5.3.3-post/examples/kafka-cluster"
$ curl -Os
"$BASE_URL"/docker-compose.yml

接下来,让我们启动Zookeeper和Kafka代理节点:

$ docker-compose up -d

最后,我们可以验证所有Kafka经纪人都在工作:

$ docker-compose logs kafka-1 kafka-2 kafka-3 | grep started
kafka-1_1      | [2020-12-27 10:15:03,783] INFO [KafkaServer id=1] started (kafka.server.KafkaServer)
kafka-2_1      | [2020-12-27 10:15:04,134] INFO [KafkaServer id=2] started (kafka.server.KafkaServer)
kafka-3_1      | [2020-12-27 10:15:03,853] INFO [KafkaServer id=3] started (kafka.server.KafkaServer)