Spring 卡夫卡一直在生成请求,即使代理已关闭
当前,当我创建producer以发送我的记录时,例如,由于某些原因,kafka不可用,producer会无限期地发送相同的消息。如何停止生成消息(例如,在我收到此错误3次后):Spring 卡夫卡一直在生成请求,即使代理已关闭,spring,apache-kafka,kafka-producer-api,spring-kafka,Spring,Apache Kafka,Kafka Producer Api,Spring Kafka,当前,当我创建producer以发送我的记录时,例如,由于某些原因,kafka不可用,producer会无限期地发送相同的消息。如何停止生成消息(例如,在我收到此错误3次后): 无法建立到节点-1的连接。代理可能不可用。而不是关注错误。修复问题-它没有连接到代理 您没有在撰写文件中覆盖此项,因此您的应用程序正在尝试连接到自身 bootstrap-servers: ${KAFKA_BOOTSTRAP_URL:localhost:9092} 在撰写yml时,您似乎忘记了这一点 rest-pro
无法建立到节点-1的连接。代理可能不可用。而不是关注错误。修复问题-它没有连接到代理 您没有在撰写文件中覆盖此项,因此您的应用程序正在尝试连接到自身
bootstrap-servers: ${KAFKA_BOOTSTRAP_URL:localhost:9092}
在撰写yml时,您似乎忘记了这一点
rest-proxy:
environment:
KAFKA_BOOTSTRAP_URL: kafka:9092
或者,如果可能,您可以使用现有的Confluent REST Proxy docker映像,而不是重新设计轮子,您可以使用它来解决此类问题,但在应用此模式之前,请尝试查找根本原因,您的ProducerConfig.RETRIES\u CONFIG属性似乎在某个地方被覆盖。我担心
clusterAndWaitTime=waitOnMetadata(record.topic()、record.partition()、maxBlockTimeMs);
不参与重试,默认情况下,它会迭代到maxBlockTimeMs=60000
。您可以通过ProducerConfig.MAX\u BLOCK\u MS\u CONFIG
属性减少生产者的此选项:
public static final String MAX_BLOCK_MS_CONFIG = "max.block.ms";
private static final String MAX_BLOCK_MS_DOC = "The configuration controls how long <code>KafkaProducer.send()</code> and <code>KafkaProducer.partitionsFor()</code> will block."
+ "These methods can be blocked either because the buffer is full or metadata unavailable."
+ "Blocking in the user-supplied serializers or partitioner will not be counted against this timeout.";
更新
我们可以这样解决问题:
@PostMapping(path = "/v1/{topicName}")
public Mono<ResponseEntity<?>> postData(
@PathVariable("topicName") String topicName, String message) {
return sender.send(Mono.just(SenderRecord.create(new ProducerRecord<>(topicName, null, message), message)))
.flatMap(result -> {
if (result.exception() != null) {
sender.close();
return Flux.just(ResponseEntity.badRequest()
.body(result.exception().getMessage()));
}
return Flux.just(ResponseEntity.ok().build());
})
.next();
}
@PostMapping(path=“/v1/{topicName}”)
public MonoMay我们有一些您如何生成记录的代码?还有,请分享更多堆栈跟踪更新我的帖子。这难道不意味着您的`props.put(ProducerConfig.RETRIES\u CONFIG,kafkaProperties.getProducerRetries())无法建立到节点-1的连接。代理可能不可用。仅此而已。该属性不会改变任何东西。我们可以在GitHub上玩一个简单的项目吗?我想了解我的应用程序在出现错误时的行为。是的,而且你连接到了错误的地址…所以,不确定为什么这值得一个downvoteas我知道Confluent rest代理正在阻塞。我想创建一个非阻塞代理。因为我想知道如何解决特定问题HTTP请求通常会以任何方式阻塞,所以我尝试了该选项。对于我的情况,它将在超时后引发异常:org.apache.kafka.common.errors.TimeoutException:无法在1000之后更新元数据但之后,制作人仍然继续向卡夫卡发送请求……考虑使用<代码> SeordOrthsOut.StOnError(true)
。有关更多信息,请查看其Javadocs。不确定原因,但仍然没有帮助…您是否尝试重现我的问题?是的,您的测试用例非常简单,但它在WebTestClient
中的Mono.blockingGet()
上5秒后就存在了,因此我看不到任何其他内容。设置此props.put之后(ProducerConfig.MAX_BLOCK_MS_CONFIG,3000)
,测试失败,出现预期错误:,原因为:java.lang.AssertionError:Status expected:但为:
。因此,不会对同一记录重试。