【问题标题】:When to close a producer or consumer何时关闭生产者或消费者
【发布时间】:2018-11-16 09:28:16
【问题描述】:

最近,我们的 Kafka 消费者和生产者遇到了一些性能问题。我们在 Scala 中使用 Kafka Java API。什么被认为是打开和关闭消费者和生产者对象的良好做法?我相信这是一个非常开放的问题,正确答案总是depends,但我正在尝试对此进行推理。

消费者可以长时间运行连接并保持打开状态吗?

是否应该在我们完成消息生成后关闭生产者?

【问题讨论】:

  • 如果您实际上不再使用 Closable 对象,是的,关闭这些资源是一种良好的 JVM 实践...这也应该直接转化为 Kafka API
  • 性能问题可能存在于代理或网络级别,并且客户端中还有很多其他缓冲选项,只是说您有一些“性能问题”是相当模糊的
  • 我同意代理或网络级别可能存在性能问题,但我们在非常频繁地打开和关闭消费者和生产者对象时遇到了问题。所以我假设这可能是一个原因。因此发布了这个问题,以获得处理此类问题的专业人士的见解。
  • 您可能想“经常”澄清一下,用代码示例会更好

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


【解决方案1】:

消费者可以长时间运行连接并保持打开状态吗?

一般来说,是的。

详细说明:取决于您的消费者配置。

如果您的消费者是消费者组的成员,他们当然应该关闭 - 以便尽早触发重新平衡。

如果您的消费者使用自动提交的偏移量,他们仍会继续每 N 毫秒 (AFAIK 60k) 提交,可能会浪费资源。

否则,他们可以留下来——但为什么要浪费资源?

是否应该在我们完成消息生成后关闭生产者?

一般来说,是的。

取决于您的设计,但如果您可以说在某个时间不再发送任何消息,那么您可以关闭。这并不意味着您应该在每次发送消息后关闭并重新创建生产者。

【讨论】:

  • 每次有客户下单我的生产者都需要发送消息,如果我不每次都关闭并重新创建生产者,会不会出现内存泄漏和问题等不好的事情?
  • 我有这个困境:如果我每次需要发送消息时都打开和关闭它不是有效的,但我讨厌看到内存泄漏和警告不要关闭实现自动关闭的对象...请有人澄清
  • 不关闭自动关闭的警告意味着找不到执行关闭的代码。这很糟糕,无论关闭/打开频率如何,都是导致泄漏的原因。如果您仍在使用它(还没有准备好关闭它),那么您就没有泄漏。如果您认为当您的应用程序死亡时它将关闭,您可能不正确。这就是显示警告的原因:您应该始终关闭,即使它在应用程序关闭期间也是如此。使用 try-with-resources 并且(象征性地)再也不用担心关闭!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多