Kafka消费者群体和分区

时间:2017-05-03 15:31:14

标签: 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}");
                }
            }

我得到了这个结果:

enter image description here

同一个消费者群体使用2个不同的分区。 当我运行两个使用不同消费者群体(a和b)的客户时,我得到了这个:

enter image description here

两个不同的消费者群体使用类似的分区。

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

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

请帮助我理解。

1 个答案:

答案 0 :(得分:5)

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

  

这些想法本身非常清晰,推送到某个主题的每条消息都会被复制到所有分区,对吗?

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

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

  

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

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

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

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

  

...并且连接到两个不同的消费者群体的两个客户端将使用两个不同的分区(假设该主题至少有两个分区),否则消费者群体的想法不符合分区。

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

  

Kafka保证邮件的顺序,对吧?它如何与同一主题的多个分区一起使用?事实上,我已经亲眼看到它并不总是如此,仅仅对于一个分区是真的吗?

您的观察结果是正确的。每个分区只能保证消息排序。幸运的是,具有相同密钥的消息将最终出现在同一个分区中,因此您可以保证按密钥排序。

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

  

我读到当我提交一个偏移量时,它被提交作为分区的一部分而不是消费者组,所以如果我在一个组中提交一个偏移量,如果它从同一个分区拉出,它是否会影响另一个组的偏移量?

每个分区和消费者组存储偏移量,即消费者组可以拥有自己的分区偏移量。这样,组之间的偏移量不会重叠。