【问题标题】:Spring Kafka consumer: Is there a way to read from multiple partitions using Kafka 0.8?Spring Kafka 消费者:有没有办法使用 Kafka 0.8 从多个分区中读取?
【发布时间】:2017-09-13 11:45:40
【问题描述】:

这是场景: 我知道使用与 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 版本很感兴趣)。

【问题讨论】:

    标签: spring apache-kafka spring-integration kafka-consumer-api spring-kafka


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我明白你的意思。我的意思基本上是一个有。与一个主题相关的 4 个分区。而我的消费者只是消费来自一个分区的消息。我发布的示例不是从不同分区读取的吗?
    • 如果你有一个消费者和 4 个分区,消费者将从所有 4 个分区中消费。
    • 好的。我刚刚更新了描述。如果您看到第二行显示分区 1,而另一行显示分区 0。在这种情况下,它是如何工作的?我从这个例子中得到了这个:howtoprogram.xyz/2016/09/25/…
    • 再次,您无法控制从哪个分区读取,这仅取决于 Kafka 内部。
    • 分区的目的是做扩展,你试图用最初设计用于主题的分区来实现一些东西
    【解决方案2】:

    这个定义对我帮助最大:

    在 Apache Kafka 中,消费者组概念是实现两个 事情:

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

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

    从这里Don't Use Apache Kafka Consumer Groups the Wrong Way!

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 2020-11-14
      • 1970-01-01
      • 2018-10-03
      相关资源
      最近更新 更多