如何正确配置Kafka Stream以确保代理弹性?

时间:2018-08-29 11:27:08

标签: apache-kafka apache-kafka-streams

最近,我尝试确保我的Kafka Streams(2.0.0版)应用程序在所有经纪人未指定的停机时间(未确定的停机时间)之后都正常运行之后,仍然能够启动并运行(流将恢复)几小时而不是几秒)。

它没有提供默认配置(retries处于0),因为在杀死所有代理之后,我所有的流都将状态更改为ERROR甚至是DEAD并停止工作:

INFO  o.a.k.s.p.internals.StreamThread - stream-thread [MyStream-0936f6a6-c9f4-4591-9b25-534abc65b8d1-StreamThread-24] State transition from RUNNING to PENDING_SHUTDOWN

然后:

INFO  o.a.k.s.p.internals.StreamThread - stream-thread [MyStream-0936f6a6-c9f4-4591-9b25-534abc65b8d1-StreamThread-24] State transition from PENDING_SHUTDOWN to DEAD

一些流尽快变为错误:

stream-client [MyStream-88a8fe9a-d565-43e3-acb5-20cccc6b4a88] State transition from RUNNING to ERROR

因此,考虑到状态转换(https://static.javadoc.io/org.apache.kafka/kafka-streams/2.0.0/org/apache/kafka/streams/KafkaStreams.State.html),除了重新启动应用程序外,我无法通过其他任何方式恢复。

我发现的是这个话题: Kafka Streams stops listening from topic and processing messages when broker goes down

它回答了我的问题,并提出了增加我的流retriesretry.backoff.ms配置的建议。这就是我所做的(将retries增大到Int.MaxNumber,将retry.backoff.ms增大到1000),发现这种方法存在一些性能问题,而我碰巧遇到了重复出现的错误在日志中:FETCH_SESSION_ID_NOT_FOUND,我实际上找不到有关的信息。

除了增加重试次数外,还有没有其他方法可以提高经纪人的弹性?我可以接受在Kafka Brokers失败后丢失的一些消息,并且如果消息无法产生/使用,我真的不需要重试。我曾考虑过在代理失败后手动重新启动流,但我不确定如何捕获“代理异常”,您如何看待?

这些是我的流配置:

buffered.records.per.partition = 1000
cache.max.bytes.buffering = 10485760
commit.interval.ms = 30000
connections.max.idle.ms = 540000
default.key.serde = ... Serdes$StringSerde
default.production.exception.handler = ... DefaultProductionExHandler
default.timestamp.extractor = ... FailOnInvalidTimestamp
default.value.serde = ... Serdes$StringSerde
metadata.max.age.ms = 300000
metric.reporters = []
metrics.num.samples = 2
metrics.recording.level = INFO
metrics.sample.window.ms = 30000
num.standby.replicas = 0
num.stream.threads = 8
partition.grouper = ... DefaultPartitionGrouper
poll.ms = 100
processing.guarantee = at_least_once
receive.buffer.bytes = 32768
reconnect.backoff.max.ms = 1000
reconnect.backoff.ms = 50
replication.factor = 1
request.timeout.ms = 40000
retries = 0
retry.backoff.ms = 1000
rocksdb.config.setter = null
security.protocol = PLAINTEXT
send.buffer.bytes = 131072
state.cleanup.delay.ms = 600000
state.dir = /tmp/kafka-state
topology.optimization = all
upgrade.from = null
windowstore.changelog.additional.retention.ms = 86400000

1 个答案:

答案 0 :(得分:0)

增加重试次数是处理代理停机时间的正确方法。

我不确定,为什么重试次数增加会对性能产生影响。您能详细说明吗?

除此之外,没有什么比“经纪人异常”更重要了。您可以在KafkaStream实例中注册未捕获的异常处理程序。它会通知您有关线程即将死亡的信息,因此,您可以通过重新启动KafkaStreams客户端来对此作出反应。

您还可以尝试更改production.exception.handler并跳过一些生产错误。请注意,在这种情况下,您可能会丢失客户端中的所有缓冲消息。 (还请注意,您无法使用处理程序跳过所有错误-某些错误被认为是致命的,并且无论您如何配置,KafkaStreams都将关闭。)