[英]Kafka Streams with single partition to pause on error
我有一个带有单个分区的 Kafka 代理。 要求是执行以下操作:
我正在使用 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();
以下是我的配置:
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);
我正在寻找一种机制来在我的 KeyValueMapper 中执行以下操作:
我检查了以下链接,但它们似乎没有帮助。
如何使用单个应用程序实例和单个主题分区有效运行 kafka 流?
以下链接讨论了 KafkaTransactionManager 但这行不通我猜上面 KStream 的初始化方式
在这个方向上的任何帮助/指针将不胜感激。
你想做的事情并没有得到真正的支持。 在 Kafka Streams 中无法暂停消费者。
您只能“停止”处理,如果您使用KeyValueMapper
循环,但是,在这种情况下,消费者可能会退出消费者组。 对于您的情况,具有单个输入主题分区并且无论如何只能在单个KafkaStreams
实例中具有单个线程,因此,它不会影响组的任何其他成员(因为没有)。 然而,问题将是在线程退出组后提交偏移量将失败。 因此,在线程重新加入组后,它将获取较旧的偏移量并重新处理一些数据(即,您将获得重复的数据处理)。 为避免退出消费者组,您可以将max.poll.interval.ms
配置设置为较高的值(甚至可能是Integer.MAX_VALUE
)——假设您在消费者组中有一个成员,则设置一个较高的值应该可以。
另一种选择可能是使用带有状态存储的transform()
。 如果您无法进行 REST 调用,则将数据放入存储区并稍后重试。 这样消费者就不会退出组。 但是,读取新数据永远不会停止,您需要缓冲存储中的所有数据,直到可以再次调用 REST API。 您应该能够通过在Transformer
“休眠”来减慢读取新数据的速度(以减少需要缓冲的数据量)——您只需要确保不违反max.poll.interval.ms
配置(默认为 30 秒)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.