当前位置: 首页 > 科技观察

Kafka中的信息是如何被消费的?

时间:2023-03-12 00:43:13 科技观察

作为一个爬虫工程师,Kafka就是为你准备的消息队列。你只需要掌握如何向其中写入数据以及如何读取数据即可。请记住:使用Kafka很容易,但构建、维护和调整Kafka集群却很麻烦。Kafka集群需要专人维护。不要认为你可以轻松完成这项工作。》这篇文章,以及接下来的几篇关于Kafka的文章,都是针对爬虫工程师或者刚好需要使用Kafka的读者。Kafka更深层次的底层细节和核心原理不在我们的讨论范围之内。为了方便说明,一些文章中的Kafka术语会使用一些不准确但有意义的类比,如果面试中需要解释这些术语,也请阅读Kafka的官方文档,今天我们要讨论的话题之一是,KafkaHow做起来,对于单个程序的多个进程,可以并行的持续消费,继续传输,消费;对于多个程序,互不影响,是独立的。一个Kafka可以有多个不同的队列,我们??称之为这个队列Topic,假设其中一个队列如下图所示:信息从右进,从左出,如果这是一个Redis列表,那么它弹出一条消息后,队列会变成如下:日e最左边的信息1不见了。所以即使程序在消费完信息1后立即关闭,然后重新打开,程序也会继续消费信息2,而不会消费信息1两次。但是如果我有两个程序呢?程序1读取每条数据,然后将其传输到数据库中。程序2读取每条数据,然后检查是否有关键字。在这种情况下,信息1应该被程序1和程序2消费。但是上述方案显然是不可行的。当程序1消费了信息1后,程序2就再也获取不到了。因此,在Kafka中,信息会留在队列中,但是对于每个程序,都有一个单独的标记来记录当前消费了哪条数据,如下图所示。当程序1要读取Kafka中的下一条数据时,Kafka先将当前位置的标记向右移动一位,并把新的值返回。标记移动和返回这两个操作一起认为是一个原子操作,不会出现重复读取的问题。程序1和程序2使用不同的标记,因此每个标记指向哪个值,是相互独立的。添加程序3时,只需要再添加一个标记即可。新标记不受前两个标记的影响。实现了多个不同程序读取Kafka时,互不影响。现在如果你觉得程序1的消费太慢,你同时跑了3次程序1,因为marking和shifting是原子操作,即使看起来程序同时在读Kafka,Kafka也会在内部读取它们进行“排队”,使它们返回的结果不重复或遗漏。如果你看网上的Kafka教程,你会发现他们提到了一个叫做Offset的东西,其实就是本文提到的每个程序中指向当前数据的标记。你还会看到一个叫Group的关键字,它实际上对应本文中的程序1、程序2和程序3。对于同一个队列,如果多个程序在不同的分组中消费,它们读取的数据不会相互干扰。对于同一个队列,当同一个Group的多个进程消费数据时,看起来就像是在对Redis进行lpop操作。最后,在网上关于Kafka的文章中,肯定会看到一个词叫Paritition或者中文分片。你会发现你无法理解这些东西。没关系,就算了。你只需要知道一个Topic有多少个Partition,最多可以启动多少个processes来读取同一个Group。——如果一个Topic有3个Partition,那么最多只能开3个进程同时读取同一个Group。如果一个topic有5个partition,那么最多只能开5个进程读取同一个group。