Kafka是一款开源的事件流软件,它可以帮助你构建基于事件驱动的系统。虽然有其他的学习指南,但是我更关注的是将Kafka背后的主要概念图形化。这样,当你阅读其他指南时,你会感到更自信。
Basics
在我们开始之前,让我们确保我们在关于Kafka的看法是一致的。 它是一款事件流软件。 它让后端服务(通常在微服务体系结构中)彼此通信。

生产者和消费者
生产者和消费者是在Kafka中监听或发送消息的服务。这些服务是您的后端服务。

一个服务可以是生产者又可以是消费者。

主题(topic)
主题是生产者可以向其发送消息的地址。其他服务可以监听这些主题。

一个服务可以监听消息并发送消息到它想要的任意多个主题。

还有一个消费者组的概念。这是一组充当单一消费者的服务。

主题可以充当消息的队列。让我们来看看这个。首先,发送一条消息。

然后,该消息被记录并存储在该队列中。此消息无法被修改的。

该消息也被发送给监听该主题的消费者。 但是,但是,该消息将永久保存在队列中,不能进行修改。

让我们发送另一个消息。只是为了再次强调一下。

与前面一样,该消息将被发送到消费者并存储在队列中。您不能更改消息,它们将被永久存储。

这是我们的Kafka集群中的每个主题。

这些不可变队列允许我们异步存储消息,而不管生产者或消费者是否出现故障。它还保证消息的正确性(它们没有被篡改)。
让我们剖开Kafka主题,看看内部。
分区(Partitions)
我说谎了。一个Kafka主题并不是一个真正的队列,而是由许多称为分区的队列组成的!

当生产者向主题发布消息时,该消息将被路由到单个分区。

消费者监听所有分区并接收所有分区的事件。

默认情况下,生产者将向主题发送消息。主题将确定消息将转到哪个分区。默认情况下,消息将通过轮询策略分配给分区。

您可以配置主题(而不是服务)来将消息分割到不同的分区。例如,如果您正在处理用户消息(并且有一个用户id),那么您可以确保同一用户的消息分配到同一个分区内。您可以通过对用户id进行hash计算,然后根据分区数对其进行计算(如:hash值/分区数 )。你明白了吧。

这样搞的好处是什么呢?好处在于分区中的每条消息都保证按时间顺序排列,因此可以按顺序消费。

进入该分区的每条消息都在该分区中排序。 即使有多个用户(或其他实体)映射到相同的分区(红色/绿色)。 您仍然可以为每个订购用户消息。

来自分区的消息将被排序。但是分区可以在任何时候发送它们的消息。因此,主题是不保证顺序。这有点奇怪。我知道。下面,请注意两个分区是如何发送它们自己的消息的。但它们是不考虑其他分区的。他们仍然保持自己的消息顺序。

如果您的消费者依赖于消息顺序(跟踪站点内的用户单击),那么您将希望深入研究这些主题分区策略(这超出了本文的讨论范围)。如果没有这种需求,你可以使用默认策略。
现在让我们再深入一点,了解一下Kafka是如何做到这一点的。
基础架构(Infrastructure)
如果我们退一步来看第一张图表。什么是Kafka云。

它实际上是一组服务器。 我们将看到的第一个是Kafka群集的头部zookeeper。

Zookeeper管理所有的主题和分区。它基维护了一组Kafka集群节点,在这些节点上存储主题和分区。这些节点是组成Kafka集群的独立机器(例如,EC2实例)。

如果我们有两个主题,每个主题有两个分区,这可能是我们之前想象它们的方式。注意,现在分区的颜色与主题相同。

我们将给分区编号,以便稍后识别它们。

现在,让我们看看这些主题如何适应我们的Kafka集群。 让我们从一个主题开始。 主题A.对于此示例,其分区#1将放在每个节点上。

您不必在每个节点上放置分区。 因为 它会变得昂贵。 另一方面,您将拥有一个有弹性的系统。 让我们看看为什么。
如果有消息进来,则会将其路由到其中一个节点中的分区,称为领导者。 zookeeper为领导者分配。

Zookeeper将像以前一样将消息发送给消费者。 它还将将消息复制到分区的其他副本,从节点。

现在,分区的每个副本都包含我们的消息! 如果一个节点拆卸或爆炸,Zookeeper将重新分配给不同的节点。

这是与我们添加的彼此分区相同的过程。我们现在将在我们的群集中保留两个分区副本。

现在让我们在另一个分区#2中添加主题A.它也只是两个副本。 现在,主题A完全在我们的集群中! 两个分区都被复制和维护。

现在,让我们在主题B的分区中添加分区。我们现在假设两个副本。 这是我们的Kafka集群与两个主题! 我们已经完成了!

比较一下我们以前的情况可能会有所帮助。注意主题是如何在集群中分布的。


结束语
我希望你现在对Kafka更好地了解。 我希望这些图形化的东西能帮助你弄清楚你在google中要搜索的问题。
谢谢你的阅读! 并且非常感谢Kafka创作者制作一个令人难以置信的平台。
原文:https://timothystepro.medium.com/visualizing-kafka-20bc384803e7
网友评论