【问题标题】:How to scale Kafka stream processing dynamically?如何动态扩展 Kafka 流处理?
【发布时间】:2019-10-04 02:00:39
【问题描述】:

我有一个主题的固定数量的分区。生产者在一天中的不同时间以不同的速度生成数据。

我想根据一天中的处理时间动态添加消费者,以便我可以尽快处理记录。

例如,我有一个主题的 10 个分区。我想在非高峰时间部署 5 个消费者,在高峰时间部署 20 个消费者。

我的问题是,当我有 20 个消费者时,每个消费者都会收到重复的记录,我想避免这种情况。我只想处理唯一记录以加快记录处理速度。

有没有什么机制可以做到这一点?

【问题讨论】:

  • 如果在同一个消费者组中有 10 个分区的 20 个消费者,那么实际上只有 10 个消费者可以工作。其他消费者将闲置,因此,您不会得到重复的记录(至少,因为消费者计数)。当消费者没有提交已处理分区的偏移量并被分配到另一个分区时,重复消息的问题可能来自重新平衡过程。为避免这种情况,您可能需要使用 ConsumerRebalanceListener

标签: java python apache-kafka kafka-consumer-api


【解决方案1】:

如果你有 N 个分区,那么在同一个消费者组中最多可以有 N 个消费者,每个消费者都从一个分区中读取。当您的消费者少于分区时,一些消费者将从多个分区中读取。此外,如果您的消费者多于分区,那么一些消费者将处于非活动状态并且根本不会收到任何消息。

因此,如果要启动 20 个消费者,则需要将主题的分区数增加到 - 至少 - 20 个,否则,10 个消费者将处于非活动状态。

关于你提到的重复,如果你所有的消费者都属于同一个组,那么每条消息只会被消费一次。

总结一下,

  1. 将主题的分区数增加到 20。
  2. 创建将根据高峰/非高峰时间创建和终止消费者的机制,并确保当您启动消费者时,它属于现有消费者组,以便消息仅被消费一次。

【讨论】:

  • 如果我增加现有主题的分区,新消息将在新旧分区上平衡,旧消息仍将在旧分区上?
  • @hardcoder 旧消息将保留在旧分区中,但新消息将分布在新旧分区中。
猜你喜欢
  • 1970-01-01
  • 2019-04-15
  • 2019-09-13
  • 1970-01-01
  • 2018-06-05
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多