1

这是场景:我知道使用与 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 主题相关的不同分区中读取。

我想知道我们是否可以使用例如 spring-integration-kafka 1.3.1 来做同样的事情

我没有找到任何关于如何做到这一点的提示(我对 xml 版本很感兴趣)。

4

2 回答 2

0

在 Kafka 中,您可以决定从哪些主题读取,但我们无法决定从哪些分区读取,这由 Kafka 决定,以避免多次读取同一消息。

根据 Kafka 的定义,消费者不会出于阅读目的共享分区。

如果你的消费者比分区多,一些消费者将保持空闲状态,不会从任何分区消费。例如,如果我们有 5 个消费者和 4 个分区,则 1 个消费者将保持空闲状态,不会使用来自 kafka 代理的数据。

实际的分区分配由 kafka 代理(组协调器)和领导消费者完成。我们无法控制。

于 2017-04-17T21:11:43.373 回答
0

这个定义对我帮助最大:

在 Apache Kafka 中,消费者组概念是实现两件事的一种方式:

将消费者作为同一个消费者组的一部分意味着提供“竞争消费者”模式,来自主题分区的消息通过该模式分布在该组的成员中。每个消费者从一个或多个分区接收消息(“自动”分配给它),并且其他消费者不会收到相同的消息(分配给不同的分区)。这样,我们可以将消费者的数量扩展到分区的数量(一个消费者只读取一个分区);在这种情况下,加入组的新消费者将处于空闲状态,不会被分配到任何分区。

将消费者作为不同消费者组的一部分意味着提供“<em>发布/订阅”模式,其中来自主题分区的消息被发送到不同组中的所有消费者。这意味着在同一个消费者组中,我们将有上面解释的规则,但在不同的组中,消费者将收到相同的消息。当主题中的消息对以不同方式处理它们的不同应用程序感兴趣时,它很有用。我们希望所有感兴趣的应用程序都能收到来自该主题的所有相同消息。

从这里不要以错误的方式使用 Apache Kafka 消费者组!

于 2018-10-09T14:55:08.060 回答