我很难掌握分区和客户群体背后的关系。卡夫卡消费群体和分区
这些想法本身就非常清晰,每个推送到主题的消息都会被复制到它的所有分区中,对吗? 这样,如果两个不同的客户端连接到同一主题的两个不同分区,则它们应该消耗并提交相同的消息而不会相互中断。
消费群体,据我所知,是抽象的,以分区的想法,他们本质上保证了同一件事,即连接到同一主题的两个不同的消费群体两个不同的客户要消耗并提交相同的消息,而无需中断每个其他。
因此,正如我所看到的,它应该遵循连接到同一个使用者组的两个客户端将使用来自同一分区的消息,并且连接到两个不同使用者组的两个客户端将消耗来自两个不同的分区至少是该主题的两个分区),否则消费者群体的想法不符合分区的想法。
然而,当我在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}");
}
}
运行一个简单的消费客户,我得到这样的结果:
同样的消费群体,从2个不同分区的消耗。 当我运行两个客户端,从不同的消费群体消费(A和B)我得到这个:
两个不同的消费群体,从类似的分区消耗。
我不明白它是怎么发生的,这是不是说消费者群体的想法和分区的想法是相互矛盾的?
如果相同的消息出现在同一分区下的两个不同的使用者组中,是不是表示相同的消息被两次插入同一分区?
请帮我理解。
我希望这个答案能更清楚地说明发生了什么事情。如果有必要,我会很乐意添加更多细节。 –
谢谢你的详细解答,我想我更了解组和分区之间的关系。我仍然有一些事情不清楚。 1.卡夫卡保证消息的顺序,对吧?它如何与同一主题的多个分区一起工作?事实上,我亲眼看到它并非总是如此,它仅适用于单个分区吗? 2.我读到,当我提交一个偏移量,它提交作为分区的一部分,而不是消费者组,所以如果我在一个组中提交偏移量,它会影响另一个偏移量,如果它从同一个分区? – areller
@Arik我根据你的评论给我的答案增加了一些细节。 –