Kafka-Streams抵消提交 - 重新处理非常旧的消息

时间:2017-05-03 06:22:01

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

我们在应用程序中使用apache kafka-streams 0.10.2.0。我们正在利用kafka-streams拓扑将处理后的数据传递到下一个主题,直到处理结束。

此外,我们使用AWS ECS容器来部署Consumer Application。 我们观察到消费者正在处理非常旧的消息以进行处理,尽管它们已经过早处理过。 此问题在服务扩展/缩小时或在新部署的情况下随机发生。我理解在消费者重新平衡时,可以重新处理一些消息。但在这种情况下,它正在重新处理大量的消息,这些消息在很长一段时间内成功处理(超过10天)

我们无法理解此问题的根本原因。是不是正确地提交了偏移量并且在不同拓扑中拾取随机消息。 这会导致在任何拓扑中重新处理一条消息的行为不一致。

令人惊讶的是,我们也没有看到消费者有任何例外。请提供帮助。

以下是我们使用的配置:

    Properties streamsConfiguration = new Properties();
    streamsConfiguration.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaHost);
    streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG,"UniqueKey");
    streamsConfiguration.put(StreamsConfig.CLIENT_ID_CONFIG,key);
    streamsConfiguration.put(StreamsConfig.KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
    streamsConfiguration.put(StreamsConfig.VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
    streamsConfiguration.put(StreamsConfig.STATE_CLEANUP_DELAY_MS_CONFIG, 60000));
    streamsConfiguration.put(StreamsConfig.NUM_STREAM_THREADS_CONFIG, 6));

以下是处理器的代码段:

    final KStreamBuilder builder = new KStreamBuilder();
    builder.addSource(key, Serdes.String().deserializer(), executor.getDeserializer(), key);
    builder.addProcessor(key + "_processor", () -> new KafkaProcessor(), key);
    builder.addSink(key + "_sink", key + "_sink", key + "_processor");
    final KafkaStreams streams = new KafkaStreams(builder, StreamConfigurations.getStreamsConfgurations(key, kafkaHost));
    streams.start();
    streams.setUncaughtExceptionHandler((t, th) -> {
    _logger.error("UncaughtException in Kafka StreamThread  " + t.getName() + " exception = ", th.getMessage());
    });
    Runtime.getRuntime().addShutdownHook(new Thread(streams::close));

我已经查看了一些kafka重新处理博客,并考虑尝试下面列出的更多配置:

    streamsConfiguration.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, Integer.MAX_VALUE);
    streamsConfiguration.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, 20000); //default is 10000
    streamsConfiguration.put(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, 5000); //default is 30000
    streamsConfiguration.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
    streamsConfiguration.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "true");
    streamsConfiguration.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, 3000); //default is 5000
    streamsConfiguration.put(ProducerConfig.ACKS_CONFIG,1);
    streamsConfiguration.put(ProducerConfig.RETRIES_CONFIG,10);

谢谢, ALPA

1 个答案:

答案 0 :(得分:0)

由于扩展而导致重新平衡的时间周围是否有代理端请求日志?我怀疑偏移获取请求/响应和后续提取中存在一些错误(例如,如果提取主题恰好被截断,因此从提交的偏移开始的提取返回"超出范围& #34;导致它重置的异常)。但是所有这些嫌疑人都需要从服务器端请求日志进行验证。

相关问题