【问题标题】:Kafka throttle producer based on consumer lag基于消费者滞后的Kafka节流生产者
【发布时间】:2019-01-15 01:13:55
【问题描述】:

是否有任何方法可以根据消费者滞后或其他消费者问题暂停或限制 Kafka 生产者?生产者是否需要确定自己是否存在消费者滞后然后自己执行节流?

【问题讨论】:

  • 我想暂停或限制生产者的原因是如果超过保留期或超过磁盘空间,我不想丢失事件,所以如果我知道基于消费者信息要暂停那么这会有所帮助。

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


【解决方案1】:

Kafka 建立在 Pub/Sub 设计之上。生产者将消息发布到集中主题。多个消费者可以订阅该主题。由于涉及多个消费者,因此您无法决定生产者的速度。一个消费者可能很慢,另一个消费者可能很快。这也违反了设计原则,否则两个系统将变得紧密耦合。如果您有节流的用例,您可能应该评估其他框架,例如直接休息调用。

【讨论】:

  • 我使用 Kafka 的原因有很多,并且放弃了直接的 REST 架构,所以告诉我回到 REST 并没有回答我的问题。我假设我的问题的答案是否定的,我想要的是不可能的。
  • @mrmannione 我实际上回答了你的问题,并告诉了你无法完成的原因。最后一行只是一个建议。如果您不想接受它,请优雅地忽略它:)
  • 问题是,如果一个消费者真的很慢,那么它可能会由于磁盘大小限制而错过消息,在这种情况下,如果生产者意识到并暂停直到它赶上或直到它被修复并缩放然后这对我来说似乎是一个很好的功能。
  • 为了提高消耗率,您可以进行并行化。增加分区数量,让更多消费者收听这些分区。
  • 是的,你问的是不可能的。通常人们通过增加消费者吞吐量来实现它。其他想法可以为您的消息增加 ttl。这样消息将保留在 kafka 代理中,消费者可以花自己的时间生产者可以继续按其速率生产。但是,如果生产者一直以相同的速度生产,它也不会起作用。
【解决方案2】:

不可能限制影响消费者性能的生产者/生产者。

在我的场景中,如果磁盘大小为 在消息被消费之前超过

要解决您的问题,您必须依赖 Kafka 提供的并行性。您的 Kafka 主题应该有多个分区,并且生产者必须使用不同的键来填充主题。因此,您的数据将分布在多个分区中,并带来一个消费者组,您可以在一组消费者中管理负载。分区内的所有数据都可以按顺序处理,这可能是相关的,因为您正在处理事件处理。

【讨论】:

  • 我有一个问题,即使我扩展消费者,其中许多消费者共享相同的后端,并且该后端有时会出现问题,因此我认为有一种方法可以在以下情况下暂停生产者那个会发生。我知道我可以暂停我可以做的消费者,但这不是我要问的。看来我要问的是不可能的。
【解决方案3】:

生产者和消费者是分离的。

Producer 将数据推送到存储在 Kafka Brokers 中的 Kafka 主题(分区主题)。生产者不知道谁以及多久消费一次消息。

消费者使用来自经纪人的数据。消费者不知道有多少生产者产生消息。即使是相同的消息也可以被不同组中的多个消费者消费。例如,一些消费者可以比其他消费者消费得更快。

您可以在 Apache Kafka 网页中阅读有关 ProducerConsumer 的更多信息

【讨论】:

  • 在我的场景中,如果在使用消息之前超出磁盘大小,我不想丢失事件,因此如果我要暂停生产者,那么任何慢速消费者都可以赶上。但我从你的回答中得知我想要的并不存在。
  • @mrmannione,磁盘大小,无法通过 Kafka API 以任何方式获取。为了不超过磁盘限制,Kafka 具有保留时间属性,可以在代理级别或主题设置。默认值为 7 天,因此如果消息是,它将从主题中删除并且不能被任何消费者消费。
猜你喜欢
  • 2021-03-14
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 2023-04-11
相关资源
最近更新 更多