2017-05-03 299 views
2

我很难掌握分区和客户群体背后的关系。卡夫卡消费群体和分区

这些想法本身就非常清晰,每个推送到主题的消息都会被复制到它的所有分区中,对吗? 这样,如果两个不同的客户端连接到同一主题的两个不同分区,则它们应该消耗并提交相同的消息而不会相互中断。

消费群体,据我所知,是抽象的,以分区的想法,他们本质上保证了同一件事,即连接到同一主题的两个不同的消费群体两个不同的客户要消耗并提交相同的消息,而无需中断每个其他。

因此,正如我所看到的,它应该遵循连接到同一个使用者组的两个客户端将使用来自同一分区的消息,并且连接到两个不同使用者组的两个客户端将消耗来自两个不同的分区至少是该主题的两个分区),否则消费者群体的想法不符合分区的想法。

然而,当我在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

两个不同的消费群体,从类似的分区消耗。

我不明白它是怎么发生的,这是不是说消费者群体的想法和分区的想法是相互矛盾的?

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

请帮我理解。

回答

4

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

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

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

请注意,只有在Kafka节点关闭的情况下,副本才能确保Kafka集群中数据的可用性。它不会影响消息处理语义。

所以,在我看来,它应该遵循连接到相同的消费群体将消耗从同一分区的消息这两个客户端...

卡夫卡将只允许一个客户端从消费一次分区。因此,同一个用户组中的客户端都不会使用来自同一分区的数据。但是,它们一次可以从多个分区中使用。另外,如果您的客户端数量多于单个组中的分区数量,则某些客户端根本无法获取任何数据,因为他们没有分区来使用数据。

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

Kafka中的分区驱动消息处理的并行化因素。您的主题所具有的分区越多,可以同时处理的客户越多。

...和两个连接到两个不同用户组的客户端将从两个不同的分区(鉴于该主题至少有两个分区)消耗,否则消费者组的想法不符合分区的想法。

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

卡夫卡保证消息的顺序,对吧?它如何与同一主题的多个分区一起工作?事实上,我亲眼看到它并非总是如此,它仅适用于单个分区吗?

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

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

我读到,当我犯的一个偏移,它致力于为分区的一部分,而不是消费群,所以,如果我犯了一组偏移,是否会影响别人的偏移,如果从拉同一个分区?

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

+1

我希望这个答案能更清楚地说明发生了什么事情。如果有必要,我会很乐意添加更多细节。 –

+1

谢谢你的详细解答,我想我更了解组和分区之间的关系。我仍然有一些事情不清楚。 1.卡夫卡保证消息的顺序,对吧?它如何与同一主题的多个分区一起工作?事实上,我亲眼看到它并非总是如此,它仅适用于单个分区吗? 2.我读到,当我提交一个偏移量,它提交作为分区的一部分,而不是消费者组,所以如果我在一个组中提交偏移量,它会影响另一个偏移量,如果它从同一个分区? – areller

+1

@Arik我根据你的评论给我的答案增加了一些细节。 –