Kafka流-TimeoutException:到期* TOPIC记录*:自创建批处理以来已过去ms

时间:2019-12-20 22:40:04

标签: apache-kafka-streams kafka-producer-api

流式应用程序在生产中推出,并在10天后立即观察CustomProductionExceptionHandler中的错误/警告,该错误/警告属于较早日期的过期交易。

流量:

输入主题->扩展应用程序(生成统计信息并在关闭日窗口后发出)->输出主题

生产者不断尝试将记录发布到OUTPUT主题,该主题已在较旧的窗口中过期,并将错误记录到CustomProductionExceptionHandler中。

我已减小了批次大小并保留默认值,但是此更改尚未推广到生产中。

CustomProductionExceptionHandler实现:为了避免流因NeworkException,TimeOutException而死。

使用此实现,生产者不会重试,并且在发生任何异常的情况下它会继续。.另一方面,返回FAIL ..流线程死亡并且不会自动重启。.需要建议。

public class CustomProductionExceptionHandler implements ProductionExceptionHandler {

    @Override
    public ProductionExceptionHandlerResponse handle(final ProducerRecord<byte[], byte[]> record,
                                                     final Exception exception) {
        String recordKey = new String(record.key());
        String recordVal = new String(record.value());
        String recordTopic = record.topic();
        logger.error("Kafka message marked as processed although it failed. Message: [{}:{}], destination topic: [{}]", recordKey,recordVal,recordTopic,exception);
        return ProductionExceptionHandlerResponse.CONTINUE;
    }
}

例外:

  

2019-12-20 16:31:37.576错误com.jpmc.gpg.exception.CustomProductionExceptionHandler.handle(CustomProductionExceptionHandler.java:19)kafka-producer-network-thread | profile-day-summary-generator-291e69b1-5a3d-4d49-8797-252c2ae05607-StreamThread-19-producerid-Kafka消息标记为已处理,尽管失败。消息:[{“ statistics”:{}],目标主题:[OUTPUT-TOPIC]

     

org.apache.kafka.common.errors.TimeoutException:过期*自批创建以来,TOPIC的记录数:1086149 ms

试图获得以下问题的答案。

1)为什么生产者试图将较早的交易发布到OUTPUT主题,而该主题的日窗口已经关闭?

示例-生产者试图发送12/09天的窗口交易,但当前打开的窗口是12/20

2)如果没有CustomProductionExceptionHandler->,流线程可能已经死亡。    ProductionExceptionHandlerResponse.CONTINUE。    在NetworkException或TimeoutException的情况下,我们是否可以使用Producer进行重试?    然后继续而不是流线程死掉?    在中指定ProductionExceptionHandlerResponse.CONTINUE的问题    CustomProductionExceptionHandler是-如果发生任何异常,则跳过    记录发布以输出主题并继续下一条记录。 没有弹性。

1 个答案:

答案 0 :(得分:0)

1)在不知道您的程序做什么的情况下,实际上不可能回答这个问题。请注意,一般而言,Kafka Streams可处理事件时间并处理乱序数据。

2)您可以在传递到{{1的Properties中指定相应的客户端配置,从而配置Kafka Streams应用程序的所有内部使用的客户端(即消费者,生产者,管理客户端和还原消费者)。 }}。如果为不同的客户端使用了不同的配置,则可以为它们加上前缀,即KafkaStreams而不是producer.retries。查看文档以获取更多详细信息:https://docs.confluent.io/current/streams/developer-guide/config-streams.html#ak-consumers-producer-and-admin-client-configuration-parameters