Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka Kafka流具有单个分区,可在出错时暂停_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Apache kafka Kafka流具有单个分区,可在出错时暂停

Apache kafka Kafka流具有单个分区,可在出错时暂停,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我有一个带单分区的Kafka代理。要求如下: 从这个分区读取 通过调用RESTAPI转换消息 将转换后的消息发布到另一个REST API 将响应消息推送到另一个主题 我使用Kafka Streams通过以下代码实现这一点 StreamsBuilder builder = new StreamsBuilder();` KStream<Object, Object> consumerStream = builder.stream(kafkaConfiguration.getConsume

我有一个带单分区的Kafka代理。要求如下:

  • 从这个分区读取
  • 通过调用RESTAPI转换消息
  • 将转换后的消息发布到另一个REST API
  • 将响应消息推送到另一个主题
  • 我使用Kafka Streams通过以下代码实现这一点

    StreamsBuilder builder = new StreamsBuilder();`
    KStream<Object, Object> consumerStream = builder.stream(kafkaConfiguration.getConsumerTopic());
    consumerStream = consumerStream.map(getKeyValueMapper(keyValueMapperClassName));
    consumerStream.to(kafkaConfiguration.getProducerTopic(), Produced.with(lStringKeySerde, lAvroValueSerde));
    return builder.build();
    
    我正在寻找一种机制,以便在KeyValueMapper中执行以下操作:

  • 如果RESTAPI中的任何一个关闭,那么我将捕获异常
  • 我希望相同的偏移量保持循环,直到系统备份或暂停消耗,直到系统备份
  • 我已经检查了以下链接,但它们似乎没有帮助

    下面的链接讨论了KafkatTransactionManager,但我想这不会起作用,因为上面的KStream是以这种方式初始化的


    非常感谢您在这方面的任何帮助/指点。

    您想做的事情实际上不受支持。在卡夫卡流中,暂停消费者是不可能的

    如果使用
    KeyValueMapper
    循环,则只能“暂停”处理,但是在这种情况下,消费者可能会退出消费者组。对于您的情况,使用单个输入主题分区,并且在单个
    KafkaStreams
    实例中只能有一个线程,因此,它不会影响组中的任何其他成员(因为没有)。但是,问题是,在线程退出组后,提交偏移量将失败。因此,在线程重新加入组后,它将获取较旧的偏移量并重新处理一些数据(即,您将获得重复的数据处理)。为了避免退出消费者组,您可以将
    max.poll.interval.ms
    config设置为一个较高的值(甚至可能是
    Integer.max_value
    ),因为消费者组中只有一个成员,所以设置一个较高的值应该是可以的


    另一种选择可能是将
    transform()
    与状态存储一起使用。如果无法进行REST调用,请将数据放入存储区,然后重试。这样,消费者就不会退出集团。但是,读取新数据永远不会停止,您需要缓冲存储中的所有数据,直到可以再次调用RESTAPI为止。您应该能够通过在
    转换器中“休眠”来降低读取新数据的速度(以减少需要缓冲的数据量)
    ——您只需确保不违反
    max.poll.interval.ms
    配置(默认值为30秒).

    目前,我正在使用定制风格的ProductionExceptionHandler,使用
    ProductionExceptionHandlerResponse跳过某些类型/风格的异常。继续
    ,而
    ProductionExceptionHandlerResponse.FAIL
    依赖于再次重试同一消息(这会杀死流,从而迫使Kubernetes吊舱重新启动)这并不是一种理想的方式,我们希望在任何API关闭的情况下重试相同的消息。感谢@Matthias J Sax提供的信息。如果您在使用处理器、转换等时问我,我想这是一个很短的时间,因为当其他系统等关闭时,人们很少希望丢失那么多消息,或者可能误解了p流的用途。我尝试了以下我认为应该有效的方法:1.调用KafkaStreams.close 2.调用Thread.sleep 300秒3.抛出RuntimeException以终止实例4.这将触发kubernetes pod的重新启动,因此消费者能够重新使用相同的偏移量againI没有说你会丢失任何message——您只需要重新处理一些消息。--您还可以在描述依赖Kubernetes重新启动实例时终止该实例,这将触发重试——当然,这不是一个通用的解决方案,因为它依赖于外部系统来重新启动应用程序。但它应该可以工作——它当然相当“沉重”而且不是很优雅——阻塞、重试和增加max.poll.interval.ms似乎更优雅。
            streamsConfig.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, String.join(",", bootstrapServers));
            if (schemaRegistry != null && schemaRegistry.length > 0) {
                streamsConfig.put(KafkaAvroSerializerConfig.SCHEMA_REGISTRY_URL_CONFIG, String.join(",", schemaRegistry));          
            }
            streamsConfig.put(this.keySerializerKeyName, keyStringSerializerClassName);
            streamsConfig.put(this.valueSerialzerKeyName, valueAVROSerializerClassName);
            streamsConfig.put(StreamsConfig.APPLICATION_ID_CONFIG, applicationId);
            streamsConfig.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
            streamsConfig.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 1000);
            streamsConfig.put(StreamsConfig.DEFAULT_TIMESTAMP_EXTRACTOR_CLASS_CONFIG, FailOnInvalidTimestamp.class);
            streamsConfig.put(StreamsConfig.PROCESSING_GUARANTEE_CONFIG, "exactly_once");
            streamsConfig.put(StreamsConfig.COMMIT_INTERVAL_MS_CONFIG, 30000);
            streamsConfig.put(StreamsConfig.NUM_STREAM_THREADS_CONFIG, 1);
            streamsConfig.put(StreamsConfig.REPLICATION_FACTOR_CONFIG, 1);
            streamsConfig.put(StreamsConfig.DEFAULT_DESERIALIZATION_EXCEPTION_HANDLER_CLASS_CONFIG, DeserializationExceptionHandler.class);
            streamsConfig.put(StreamsConfig.DEFAULT_PRODUCTION_EXCEPTION_HANDLER_CLASS_CONFIG, ProductionExceptionHandler.class);
            streamsConfig.put(StreamsConfig.TOPOLOGY_OPTIMIZATION,StreamsConfig.OPTIMIZE);
            streamsConfig.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, compressionMode);
            streamsConfig.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 1000);