这是一个场景:我知道,使用与spring kafka相关的最新api(如spring integration kafka 2.10),我们可以执行以下操作:
@KafkaListener(id = "id0", topicPartitions = { @TopicPartition(topic = "SpringKafkaTopic", partitions = { "0" }) })
@KafkaListener(id = "id1", topicPartitions = { @TopicPartition(topic = "SpringKafkaTopic", partitions = { "1" }) })
从与同一Kafka主题相关的不同分区读取。
我想知道我们是否可以使用SpringIntegrationKafka1.3.1来实现同样的功能
我没有找到任何关于如何做到这一点的提示(我对xml版本很感兴趣)。
2条答案
按热度按时间fivyi3re1#
这个定义对我帮助最大:
在apache kafka中,消费者群体概念是实现两件事的一种方式:
将消费者作为同一消费者组的一部分意味着提供“竞争消费者”模式,来自主题分区的消息与之一起分布在该组的成员中。每个使用者从一个或多个分区(“自动”分配给它)接收消息,而其他使用者(分配给不同分区)不会接收相同的消息。这样,我们可以将使用者的数量扩展到分区的数量(一个使用者只读取一个分区);在这种情况下,加入组的新使用者将处于空闲状态,而不被分配到任何分区。
将消费者作为不同消费者组的一部分意味着提供“发布/订阅”模式,其中来自主题分区的消息被发送到不同组中的所有消费者。这意味着在同一个消费者组中,我们将有上面解释的规则,但是在不同的组中,消费者将收到相同的消息。当主题中的消息对不同的应用程序感兴趣时,它会很有用,这些应用程序将以不同的方式处理它们。我们希望所有感兴趣的应用程序都能收到来自主题的所有相同消息。
从这里开始,不要以错误的方式使用apachekafka消费群体!
dfuffjeb2#
在kafka中,您可以决定要从哪个主题阅读,但我们不能决定要从哪个分区阅读,而是由kafka来决定,以避免多次阅读同一条消息。
根据kafka的定义,消费者不会为了阅读而共享分区。
如果您将拥有比分区更多的使用者,那么一些使用者将保持空闲,并且不会从任何分区进行消费。例如,如果我们有5个使用者和4个分区,那么1个使用者将保持空闲,并且不会使用来自kafka代理的数据。
实际的分区分配是由kafka代理(组协调器)和leader consumer完成的。我们控制不了。