Kafka消费群体和分区

are*_*ler 2 c# apache-kafka

我很难掌握分区和客户群之间的关系。

想法本身很明确,推送到某个主题的每条消息都会复制到其所有分区中,对吗?这样,如果两个不同的客户端连接到同一主题的两个不同的分区,则它们应该使用并提交相同的消息而不会互相干扰。

据我所知,消费者组是对分区概念的抽象,它们本质上是在承诺同一件事,连接到同一主题的两个不同消费者组的两个不同的客户端应该使用并提交相同的消息而不会互相干扰。

因此,正如我所看到的,应该遵循的条件是,连接到同一使用者组的两个客户端将使用同一分区中的消息,而连接到两个使用者组的两个客户端将使用两个不同的分区中的消息(假设至少有两个分区),因为否则,消费者组的概念与分区的概念不符。

但是,当我在C#中运行一个简单的消费者客户端时

string group = Console.ReadLine();

            var config = new Dictionary<string, object>()
            {
                { "group.id", group },
                { "bootstrap.servers", "10.0.0.3:9092" },
                { "enable.auto.commit", true },
                { "auto.commit.interval.ms", 1000 }
            };

            using (var consumer = new Consumer<Null, string>(config, null, new StringDeserializer(Encoding.UTF8)))
            {
                consumer.Subscribe(new List<string>() { { "myFirstTopic" } });
                while (true)
                {
                    Message<Null, string> msg;
                    if (!consumer.Consume(out msg, TimeSpan.FromMilliseconds(100)))
                    {
                        continue;
                    }

                    Console.WriteLine($"Topic: {msg.Topic} Partition: {msg.Partition} Offset: {msg.Offset} {msg.Value}");
                }
            }
Run Code Online (Sandbox Code Playgroud)

我得到这个结果:

在此处输入图片说明

同一消费者组从两个不同的分区进行消费。当我运行两个从不同消费者组(a和b)消费的客户端时,我得到以下信息:

在此处输入图片说明

两个不同的消费者组从相似的分区进行消费。

我不明白它是如何发生的,这是否意味着消费者群体的想法和分区的想法相互矛盾?

如果同一消息出现在同一分区下的两个不同的使用者组中,这是否意味着同一消息两次插入同一分区?

请帮助我理解。

Jaa*_*ari 5

您对消费者群体的理解是正确的,但是分区中的细节需要澄清。

想法本身很明确,推送到某个主题的每条消息都会复制到其所有分区中,对吗?

不完全是。一条消息将被写入单个分区(及其副本)。写入主题的所有消息都将在主题的分区之间分配。因此,每个分区将仅包含写入该主题的所有消息的子集。

请注意,如果Kafka节点发生故障,副本仅是确保Kafka群集中的数据可用性的一种方法。它不影响消息处理语义。

因此,正如我所看到的,应该遵循的是,连接到同一使用者组的两个客户端将使用来自同一分区的消息...

Kafka一次只允许一个客户端从一个分区使用。因此,同一使用者组中的所有客户端都不会使用同一分区中的数据。但是,它们一次可以消耗多个分区。另外,如果单个组中的客户机多于分区,则某些客户机根本不会获得任何数据,因为没有分区可供它们使用数据。

由于分区仅包含数据的一个子集,并且一次仅分配给一个客户端,因此每个客户端将消耗写入主题的唯一数据子集。因此,您可以说具有单个使用者组安排的多分区的工作方式类似于工作程序模式。

Kafka中的分区会驱动您的消息处理的并行化因子。您的主题具有的分区越多,可以并行工作的客户端就越多。

...并且连接到两个不同消费者组的两个客户端将从两个不同的分区中消费(假设该主题至少有两个分区),因为否则消费者组的概念与分区的概念不一致。

如果您的客户位于不同的使用者组中,则它们可以从相同的分区使用。因此,所有消费者组将接收相同的数据集。多个消费者组的安排类似于扇出模式。

Kafka保证消息顺序,对吗?在同一个主题的多个分区中如何使用?实际上,我已经亲眼看到它并不总是正确的,仅对单个分区是正确的吗?

您的观察是正确的。只能按分区保证消息排序。幸运的是,具有相同密钥的邮件将最终位于同一分区中,因此您可以保证按密钥排序。

例如,假设您有一个所有论坛帖子评论的主题。如果您只关心单个论坛帖子中评论的排序,则可以选择论坛帖子标识符作为所有评论的消息键。

我读到,当我提交偏移量时,它将作为分区而不是使用者组的一部分提交,因此,如果我在一个组中提交偏移量,如果它从同一分区中拉出,会影响另一个偏移量吗?

偏移量是按分区和使用者组存储的,即使用者组可以具有自己的分区偏移量。这样,偏移量不会在组之间重叠。