java - 卡夫卡流延迟启动消费者优雅关闭的重新平衡

标签 java apache-kafka apache-kafka-streams

这是我之前发送的有关 Kafka Streams 中高延迟问题的后续问题; (Kafka Streams rebalancing latency spikes on high throughput kafka-streams services)。

快速提醒一下,我们的无状态服务具有非常严格的延迟要求,并且我们面临着过高的延迟问题(某些消息在生成后消耗了 10 秒以上),特别是当消费者优雅地离开组时。

经过进一步调查,我们发现至少对于小型消费群体来说,重新平衡花费的时间不到 500 毫秒。所以我们想,移除一个消费者(>10s)时如此巨大的延迟来自哪里?

我们意识到这是消费者优雅退出和重新平衡开始之间的时间。

之前的测试是在 Kafka 和 Kafka Streams 应用程序中使用全默认配置执行的。 我们将配置更改为:

properties.put("max.poll.records", 50); // defaults to 1000 in kafkastreams
properties.put("auto.offset.reset", "latest"); // defaults to latest
properties.put("heartbeat.interval.ms", 1000);
properties.put("session.timeout.ms", 6000);
properties.put("group.initial.rebalance.delay.ms", 0);
properties.put("max.poll.interval.ms", 6000);

结果是重新平衡开始的时间下降到了 5 秒多一点。

我们还测试了通过“kill -9”非优雅地杀死消费者;结果是触发重新平衡的时间是完全相同的。

所以我们有一些问题: - 我们期望当消费者优雅地停止时立即触发重新平衡,这应该是预期的行为吗?为什么它在我们的测试中没有发生? - 我们如何减少消费者优雅退出和触发重新平衡之间的时间?有哪些权衡?更多不必要的重新平衡?

为了了解更多背景信息,我们的 Kafka 版本是 1.1.0,在查看找到的库(例如 kafka/kafka_2.11-1.1.0-cp1.jar)后,我们安装了 Confluence 平台 4.1.0。在消费者方面,我们使用 Kafka-streams 2.1.0。

谢谢!

最佳答案

当实例正常关闭时,Kafka Streams 不会发送“离开组请求”——这是故意的。目标是在实例被退回时避免昂贵的重新平衡(例如,如果升级应用程序;或者如果在 Kubernetes 环境中运行并且 POD 自动快速重新启动)。

为了实现此目的,使用了非公共(public)配置。您可以通过覆盖配置

props.put("internal.leave.group.on.close", true); // Streams' default is `false`

关于java - 卡夫卡流延迟启动消费者优雅关闭的重新平衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54398754/

相关文章:

apache-kafka - 将消息从一个 Kafka 集群传输到另一个集群

java - java.util.Calendar 的默认时区是什么?

java - 保持文件句柄打开,还是根据需要重新打开?

java - Kafka 的 JsonDeserializer 不适用于 java.util.Map

apache-kafka - Kafka 中的 commit-log 是什么意思?

java - 使用 Kafka Streams 进行 OpenTracing - 如何?

java - 合并多个相同的 Kafka Streams 主题

java - 关于将 BufferedImage 添加到 JPanel

java - 无法在 Spring 中使用构造函数 Autowiring bean

python - 类型错误 : __init__() takes exactly 1 argument (2 given)