Kafka消费群体与划分

nwwlzxa7  于 2021-06-08  发布在  Kafka
关注(0)|答案(1)|浏览(416)

我很难理解分区和客户群之间的关系。
这些想法本身非常清晰,每个推送到主题的消息都会被复制到它的所有分区,对吗?这样,如果两个不同的客户机连接到同一主题的两个不同分区,那么它们应该在不中断彼此的情况下使用和提交相同的消息。
据我所知,消费者组是分区概念的抽象,它们本质上承诺了相同的事情,连接到同一主题的两个不同消费者组的两个不同客户机应该消费并提交相同的消息,而不会互相中断。
所以在我看来,因此,连接到同一使用者组的两个客户机将使用来自同一分区的消息,而连接到两个不同使用者组的两个客户机将使用来自两个不同分区的消息(假定该主题至少有两个分区),因为否则使用者组的概念就不适用遵循分区的思想。
但是,当我在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}");
                }
            }

我得到这个结果:

同一消费群体从两个不同的分区消费。当我运行两个使用不同消费群体(a和b)的客户机时,我得到以下结果:

两个不同的消费群体从相似的分区消费。
我不明白这是怎么发生的,难道这不意味着消费群体的理念和分区的理念相互矛盾吗?
如果同一消息出现在同一分区下的两个不同使用者组中,不意味着同一消息被插入同一分区两次吗?
请帮助我理解。

erhoui1w

erhoui1w1#

您对消费者群体的理解是正确的,但是分区中的细节需要澄清一下。
这些想法本身非常清晰,每个推送到主题的消息都会被复制到它的所有分区,对吗?
不完全是。消息将被写入单个分区(及其副本)。写入主题的所有消息都将在主题的分区之间拆分。因此,每个分区将只包含写入主题的所有消息的子集。
请注意,复制副本只是一种确保kafka集群中数据可用性的方法,以防kafka节点宕机。它不影响消息处理语义。
所以在我看来,两个连接到同一消费者组的客户机将使用来自同一分区的消息。。。
kafka一次只允许一个客户机从一个分区消费。因此,同一使用者群组中的所有用户端都不会使用来自同一分区的资料。但是,它们一次可以使用多个分区。另外,如果单个组中的客户机多于分区,则有些客户机根本不会获取任何数据,因为没有分区可供它们使用数据。
由于分区只有一部分数据,而且一次只分配给一个客户机,因此每个客户机将使用写入主题的唯一数据子集。因此,您可以说具有单个使用者组安排的多分区的工作方式类似于worker模式。
kafka中的分区驱动了消息处理的并行化因子。主题的分区越多,可以并行工作的客户机就越多。
…而连接到两个不同使用者组的两个客户机将使用两个不同的分区(假设该主题至少有两个分区),因为否则使用者组的概念与分区的概念不一致。
如果客户机位于不同的使用者组中,则它们可以从相同的分区进行消费。因此,所有消费群体都将收到相同的数据集。多个消费群体的安排类似于扇出模式。
Kafka保证信息的顺序,对吗?如何处理同一主题的多个分区?事实上,我亲眼看到,这并不总是正确的,是不是只有一个分区是正确的?
你的观察是正确的。只能保证每个分区的消息顺序。幸运的是,具有相同密钥的消息将在同一分区中结束,因此您可以保证按密钥排序。
例如,假设所有论坛帖子评论都有一个主题。如果您只关心单个论坛帖子中评论的排序,则可以选择论坛帖子标识符作为所有评论的消息键。
我读到,当我提交一个偏移量时,它是作为分区的一部分提交的,而不是作为使用者组提交的,所以如果我在一个组中提交一个偏移量,如果它从同一个分区提取,它会影响另一个组的偏移量吗?
偏移量存储在每个分区和使用者组中,即使用者组可以有自己的分区偏移量。这样,组之间的偏移就不会重叠。

相关问题