Kafka-停止在ConnectException上重试

时间:2018-09-13 06:34:57

标签: java apache-kafka

我有一个定义为

的kafka生产者
public KafkaMessageProducer(String kafkaHost, String kafkaPort, Map<String, String> map) {
        this.kafkaTopic = map;
        final Properties properties = new Properties();
        properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        properties.put("bootstrap.servers", kafkaHost + ":" + kafkaPort);
        producer = new KafkaProducer<String, String>(properties);
    }

我正在使用以下代码发送消息。 (也尝试使用回调)。

public void sendMessage(String topic, RestCommonResource resultToken) {

        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode  jsonNode = objectMapper.valueToTree(resultToken);
        ProducerRecord<String, String> record = new ProducerRecord<String, String>(topic, jsonNode.toString());
        producer.send(record);

    }

但是,如果kafka服务器已关闭,并且生产者发布了一条消息,则程序将陷入无限循环,并出现以下异常:

WARN  [2018-09-13 06:27:59,589] org.apache.kafka.common.network.Selector: Error in I/O with localhost/127.0.0.1
! java.net.ConnectException: Connection refused: no further information
! at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[na:1.7.0_80]
! at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:744) ~[na:1.7.0_80]
! at org.apache.kafka.common.network.Selector.poll(Selector.java:238) ~[kafka-clients-0.8.2.1.jar:na]
! at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:192) [kafka-clients-0.8.2.1.jar:na]
! at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:191) [kafka-clients-0.8.2.1.jar:na]
! at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:122) [kafka-clients-0.8.2.1.jar:na]
! at java.lang.Thread.run(Thread.java:745) [na:1.7.0_80]

如果可以设置任何属性来停止此重试并丢弃消息。

3 个答案:

答案 0 :(得分:0)

  

当前,如果Kafka客户端失去与代理的连接,它将在尝试重新连接之前等待 reconnect.backoff.ms 毫秒。

     

如果单个代理或整个集群很长时间不可用时,如果客户端在短时间内断开连接,则此策略效果很好,所有客户端将迅速生成大量连接。

     

此外,开发人员对客户端的控制有限,该客户端不断失去与集群的连接。

我认为该主题对您有用:Add custom policies for reconnect attempts to NetworkdClient

  

reconnect.backoff.ms :尝试重新连接到给定主机之前要等待的基本时间。这样可以避免以紧密的循环重复连接到主机。此回退适用于客户端到代理的所有连接尝试。

     

reconnect.backoff.max.ms :重新连接到反复连接失败的代理时要等待的最长时间(以毫秒为单位)。如果提供此选项,则对于每个连续的连接失败,每台主机的退避量将成倍增加,直至此最大值。计算退避增量之后,添加20%的随机抖动以避免连接风暴。

答案 1 :(得分:0)

您还需要包括以下Producer属性

reconnect.backoff.ms

使用WARNreconnect.backoff.ms只会出现一次。

关于Kafka docs

  

<dependentAssembly> <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" /> </dependentAssembly>
尝试之前等待的基本时间   重新连接到给定的主机。这样可以避免重复连接到   主机处于紧密循环中。此退回适用于所有连接尝试   由客户委托给经纪人。

答案 2 :(得分:0)

您还可以尝试限制发送消息delivery.timeout.ms的生存期。

呼叫后报告成功或失败时间的上限 send()返回

相关问题