我正在一个开发环境中,在我的系统上有3个(docker化的)kafka代理。 代理将transaction.state.log.replication.factor设置为3。
在流应用程序配置中,我将processing.guarantee设置为EXACTLY_ONCE,而在消费者应用程序配置中,我将isolatest.level设置为“ read_committed”。
我已经检查了https://docs.confluent.io/current/streams/developer-guide/config-streams.html#processing-guarantee上的其他配置,并根据指南设置了环境。
从流应用程序读取消息一分钟后,该应用程序读取状态存储并使用context.forward(..)函数生成100条消息,使用者应用程序停止读取,好像在分配的分区上没有任何提交的消息一样
一段时间后,流应用程序崩溃,并显示以下错误:
“由于致命错误而中止生产者批次 org.apache.kafka.common.errors.ProducerFencedException:生产者 尝试以旧时代进行手术。要么有更新的 具有相同transactionalId的生产者,或生产者的交易 已由经纪人过期。”
似乎流生产者无法接收到确认并且事务到期。
修改1: 当我停止流应用程序时,使用者将收到已提交的消息。
答案 0 :(得分:0)
提高Kafka服务器和客户端版本似乎可以解决问题