我正在阅读Kafka documentation关于消费者的信息,并且遇到了以下消息消费定义:
我们的主题分为一组完全有序的分区,每个分区 每次订阅中只有一位消费者消费 在任何给定时间的消费群体。这意味着 每个分区中的使用者只是一个整数,即偏移量 下一条要消耗的消息。
我的措词解释如下:
使用者组从包含多个分区的主题中读取数据。然后,向该组中的每个消费者分配一些分区子集,这些子集与该组中其他消费者的分区不重叠。
请考虑以下情况:
由2个使用者RefOrValue
和GRP
组成的使用者组C1
从主题C2
读取数据,该主题由两个分区TPC
和{{1}组成}。
问题::如果某个时候P1
从P2
读取而C1
从P1
读取,则可以重新平衡,以便{{1 }}从C2
开始读取,P2
从C1
开始读取。如果是这样,在哪种情况下可能会发生?
它与上面的引用并不矛盾。
答案 0 :(得分:1)
我在您的问题和评论中看到一些要讨论的事情。
您对引用段落的解释正确。
问题“如果是,在哪种情况下会发生?”: 是的,这种情况可能发生。消费者对TopicPartition分配的更改主要是通过重新平衡来触发的。在以下情况下将触发消费者重新平衡:
消费平衡在以下时间启动
一个消费者离开了消费者组(由于未能及时发送心跳或明确要求离开)
新的消费者加入了消费者组
消费者更改其主题订阅
消费者组注意到任何订阅的主题的主题元数据发生了变化 (例如,分区数量的增加)
[来源:Confluent Kafka开发人员的培训材料]
请记住,在重新平衡期间,所有消费者都将暂停。
我认为这种情况与消费者的重新平衡无关,因为消费者C1可能只是在处理数据之后但在将数据提交给Kafka之前死亡。现在,如果重新启动使用者C1,它将再次读取相同的消息,因为它尚未提交它们。
这称为“至少一次”传递语义,当您具有例如自动提交已启用。我猜您在寻找分布式系统中的“圣杯”,它是“一次语义”:)
为此,您需要考虑从Kafka到应用程序接收器的整个应用程序。如果应用程序的输出不是幂等的,则可能无法实现一次语义化(EOS)。但是如果您的输出沉再次是Kafka,您实际上可以实现EOS。