Spring 卡夫卡一直在生成请求,即使代理已关闭

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

当前,当我创建producer以发送我的记录时,例如,由于某些原因,kafka不可用,producer会无限期地发送相同的消息。如何停止生成消息(例如,在我收到此错误3次后):


无法建立到节点-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:但为:
。因此,不会对同一记录重试。