如果我有一个主题,并且多个使用者具有相同的groupId,则只有一个使用者应接收消息(领导者)。我想选择哪个消费者将成为领导者并使用Java接收消息,但我不知道该怎么做。
这是我的使用者之一的代码。有一些属性可以选择领导者吗?
@KafkaListener(topics = {"topic_kafka","topic_kafkaaa"}, groupId = "group_id")
public void consume(String message) throws IOException {
log.info("Consumed message in {} : {}", TOPIC, message);
}
最佳答案
我认为Kafka消费者群体的工作方式可能与您预期的不同。卡夫卡消费群体没有领导者。订阅了一个消费者组的主题,这些主题的分区总数为X。Kafka然后将组中的所有这些消费者视为一个逻辑实体(假设是否将消息传递给他们中的任何一个,则其交付给实体),并将X个分区划分为组中所有可用的使用者。如果您有更多的使用者,而不是分区的数目,那么多余的闲置空间。它是一个动态分配系统。
您可能正在考虑领导者,因为您正在考虑代理模型,在该模型中,主题的副本分布在多个代理中,并且其中一个代理是该主题的领导者。消费者不是这样工作的。
如果您想确保特定的使用者是唯一收到消息的使用者,那么您需要为其指定自己的使用者组。