【问题标题】:Spring Kafka Multiple Consumers for a Partition一个分区的 Spring Kafka 多个消费者
【发布时间】:2017-09-10 07:56:49
【问题描述】:

我们正在使用 spring kafka 来消费消息。我们为每个分区创建了接收器来接收消息。现在我们需要多个接收者来接收来自单个分区的消费者消息。

例如假设我们有一个分区 0。目前我们只有一个接收器(接收器 1)从这个分区接收消息。 现在我想为同一个分区(分区 0)添加另一个接收器(接收器 2)。

因此,如果 Producer 向此分区发送 100 条消息,则 Receiver 1 应接收 50 条消息,而 Receiver 2 应接收剩余的 50 条消息。我不希望消息重复。两个接收器类属于同一个组。(我设置了 props.put("group.id", "unique_group_id") )

请帮助我了解这种情况是否可行。

【问题讨论】:

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


    【解决方案1】:

    不,你不能这样做。每个分区只能被单个消费者组中的一个消费者消费。

    如果你想让 2 个消费者消费同一个分区,这 2 个消费者必须属于 2 个不同的消费者组。但是,在这种情况下,两个消费者都会收到这个分区的所有消息。

    看来您需要的是worker queue。 2 个 worker 从一个队列中消费消息,每条消息只会被一个 worker 消费。有很多开源的worker queues,比如ActiveMQRabbitMQ等等。

    【讨论】:

    • 但是我们已经完成了技术栈。所以不能用任何队列替换 Kafka。我们在 kafka 代理中是否有任何配置,我可以指定生产者只发送一份消息副本,而与消费者组无关?
    • Kafka 不支持分区上的竞争消费者。消费者并发受到分区数量的限制。要增加并发性,只需增加分区数即可。 > finalized technology stack - 听起来很奇怪 - 你怎么能在不了解技术的情况下选择它?
    • @user3811946 没有这样的配置。正如 Gary Russell 所说,你必须增加分区数量才能增加并发性。另一种解决方案是,对于每个消费者,将一个分区的数据发送到worker queue,然后让多个工作人员处理这些消息。然而,这个解决方案更复杂。也许你应该重新考虑你的设计。
    • 如果将 kafka 作为一种技术固定下来,您可以使用 spark 流作为一个消费者进行处理。这样一来,您就可以抵消微服务方法,将多个消费者与一个具有多个执行者的大火花流相结合
    【解决方案2】:

    如果你不能增加主题的分区数量,你可以使用一些“讨厌”的技巧。在两个接收器中使用不同的 consumer-group-id 并在 pool() 之后丢弃一个接收器上具有偶数偏移量的消息和第二个接收器上具有奇数偏移量的消息,如下所示:

      R1       R2
    | 100      100 [X]
    | 101 [X]  101
    | 102      102 [X]
    | 103 [X]  103
    v 104      104 [X]
    

    这会起作用,但会产生一些后果:

    • 它不可扩展(您不能轻易地将另一个接收器添加到分区)
    • 如果一个接收器卡住/死机,第二个接收器将无法处理它的工作
    • 不同消费者群体的抵消管理非常困难(尤其是在生产者不受您控制的情况下)

    【讨论】:

      猜你喜欢
      • 2015-08-19
      • 2019-04-07
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 2021-05-14
      • 2023-03-19
      • 1970-01-01
      • 2022-06-13
      相关资源
      最近更新 更多