Java Kafka streaming-TimeoutException:自批创建以来,主题:*的*记录已过期
流式处理应用程序在生产环境中推出,10天后在CustomProductionExceptionHandler中观察到属于旧窗口的过期事务的错误/警告 流量: 输入主题-->流媒体应用程序(在日窗口关闭后生成统计数据并发出)-->输出主题 生产者持续尝试将记录发布到输出主题,该主题已在旧窗口中过期,并将错误记录到CustomProductionExceptionHandler中 我减少了批量大小并保留了默认值,但此更改尚未升级到生产 CustomProductionExceptionHandler实现:避免由于NewWorkException、TimeOutException而流式处理死亡 使用此实现,生产者不会重试,如果出现任何异常,生产者会继续。。在另一侧返回时失败。。流线程死亡且无法自动重新启动..需要建议Java Kafka streaming-TimeoutException:自批创建以来,主题:*的*记录已过期,java,apache-kafka,apache-kafka-streams,kafka-producer-api,Java,Apache Kafka,Apache Kafka Streams,Kafka Producer Api,流式处理应用程序在生产环境中推出,10天后在CustomProductionExceptionHandler中观察到属于旧窗口的过期事务的错误/警告 流量: 输入主题-->流媒体应用程序(在日窗口关闭后生成统计数据并发出)-->输出主题 生产者持续尝试将记录发布到输出主题,该主题已在旧窗口中过期,并将错误记录到CustomProductionExceptionHandler中 我减少了批量大小并保留了默认值,但此更改尚未升级到生产 CustomProductionExceptionHandler
公共类CustomProductionExceptionHandler实现ProductionExceptionHandler{
@凌驾
公共产品异常句柄响应句柄(最终产品记录记录,
最终例外情况(例外情况){
String recordKey=新字符串(record.key());
String recordVal=新字符串(record.value());
字符串recordTopic=record.topic();
logger.error(“Kafka消息虽然失败但标记为已处理。消息:[{}:{}],目标主题:[{}]”,recordKey,recordVal,recordTopic,exception);
返回ProductionExceptionHandlerResponse.CONTINUE;
}
}
例外情况:
2019-12-20 16:31:37.576错误com.jpmc.gpg.exception.CustomProductionExceptionHandler.handle(CustomProductionExceptionHandler.java:19)卡夫卡生产者网络线程| profile-day-summary-generator-291e69b1-5a3d-4d49-8797-252c2ae05607-StreamThread-19-producerid-卡夫卡消息标记为已处理,但失败。消息:[{“统计”:{}],目标主题:[输出主题]
org.apache.kafka.common.errors.TimeoutException:自批创建以来,主题1086149 ms的*记录已过期
试图得到以下问题的答案
1) 为什么生产商试图将较旧的事务发布到已关闭日期窗口的输出主题
示例-生产商试图发送12/09天窗口交易,但当前打开的窗口为12/20
2) 如果没有CustomProductionExceptionHandler-->
ProductionExceptionHandlerResponse.CONTINUE。
在NetworkException或TimeoutException发生时,我们是否有任何方法可以让生产商重试
然后继续而不是流线程死?
在中指定ProductionExceptionHandlerResponse.CONTINUE时出现问题
CustomProductionExceptionHandler是-在跳过任何异常的情况下
将该记录发布到输出主题并继续下一个记录。没有弹性。1)在不知道程序的情况下,不可能回答此问题。请注意,一般来说,Kafka Streams在事件时间工作并处理无序数据
2) 您可以配置Kafka Streams应用程序的所有内部使用的客户端(即使用者、生产者、管理客户端和还原使用者)通过在属性中指定相应的客户端配置
可以传递到KafkaStreams
。如果要为不同的客户端配置不同的配置,可以相应地为它们添加前缀,即,producer.retries
而不是retries
。有关详细信息,请查看文档: