有时,我的kafka流应用程序死于以下错误:
[-StreamThread-4] o.a.k.s.p.i.AssignedStreamsTasks : Failed to commit stream task 0_9 due to the
following error:
org.apache.kafka.common.errors.TimeoutException: Timeout of 60000ms expired before successfully
committing offsets {my-topic-9=OffsetAndMetadata{offset=5840887122, leaderEpoch=null, metadata=''}}
从docs中,我假设 60000ms 来自该属性: default.api.timeout.ms 。所以我大概可以增加这个超时时间。但是我还有其他选择吗?
我的应用程序以 processing-guarantee:fully_once 运行,为此,我在文档中找到了以下内容:
commit.interval.ms :保存位置的频率 处理器。 (请注意,如果将processing.guarantee设置为fully_once, 默认值为100,否则默认值为30000。
因此,在我的情况下,提交间隔非常短。为什么对于just_once必须如此之低?我可以增加间隔时间以减少提交次数,从而放松情况吗?
我还有其他选择吗?
答案 0 :(得分:1)
增加超时时间当然是一种选择。实际上,正在进行一些工作,以使Kafka Streams对超时异常的恢复更具弹性:https://cwiki.apache.org/confluence/display/KAFKA/KIP-572%3A+Improve+timeouts+and+retries+in+Kafka+Streams
关于commit.interval.ms
:设置为较低可将应用程序的端到端延迟保持在较低水平。只要事务待处理,下游使用者(处于"read_committed"
模式)就无法消耗数据,因此在提交事务之前会经历额外的延迟。对于可能具有多个重新分区步骤的Kafka Streams应用程序,必须经常进行提交以保持较低的延迟。
因此,根据您的延迟要求,您可能无法增加提交间隔。