这是一个简单、普通的Kafka Streams应用程序,它使用EXACTLY_ONCE_V2
进行简单的记录转换。
configurationParameters.put(StreamsConfig.PROCESSING_GUARANTEE_CONFIG, StreamsConfig.EXACTLY_ONCE_V2);
我看到的错误如下。如果我删除上面提到的EXACTLY_ONCE_V2设置,则此错误将消失,流应用程序将运行数天而不会出现错误。错误日志为:
[错误]2021-11-27 18:10:23.141[kafka生产者网络线程|id-mapping-app-1eede139-ace6-4aff-9e94-ca508cb9c98d-StreamThread-1-生产者]RecordCollectorImpl-流线程[id-mapping-app-1eede139-ace6-4aff-9e94-ca508cb9c98d-StreamThread-1]任务[0_11]由于以下原因将记录发送到任务0_11的主题数据记录输出时遇到错误:org.apache.kafka.commun.errors.InvalidProducerEpochException:生产者试图使用旧的epoch进行生产。由于生产者被隔离,因此不会记录书面偏移,也不会发送更多记录,这表明任务可能会迁移出
应用程序使用的是Kafka Streams 3.0.0,这是本文撰写时的最新版本。Gradle风格的Maven坐标为:org.apache.kafka:kafka-streams:3.0.0
Kafka经纪人在Kubernetes上运行Strimzi 0.23.0下的Kafka 2.8.0。
我在使用Flink框架而不是Kafka Streams:的类似应用程序中也遇到了完全相同的错误消息
Flink 1.13.2:`ProducerFencedException:Producer尝试使用旧epoch`进行操作
在Flink和Kafka流中,只要禁用一次,错误就会消失。如果我只在处理错误时打开。
broker日志中的信息是什么?就我而言,原因是:
INFO [TransactionCoordinator id=3] Completed rollback of ongoing transaction for transactionalId stats-mapper-ac83167f-5e02-4fb1-92cd-cec0e6c7332f-2 due to timeout (kafka.coordinator.transaction.TransactionCoordinator)
ERROR [ReplicaManager broker=3] Error processing append operation on partition stats.topic-1 (kafka.server.ReplicaManager)
org.apache.kafka.common.errors.InvalidProducerEpochException: Epoch of producer 1015 at offset 2395825914 in stats.topic-1 is 0, which is smaller than the last seen epoch 1
看起来这是一个正在进行的KIP-588,预计将在3.2.0 KAFKA-9803中修复。
KIP表示
这可能是由于网络分区或长GC导致客户端短时间不活动造成的。
虽然我不确定";网络分区";意味着GC的监视和查看非常琐碎。