当群集的一个Kafka代理关闭时,ConnectException

时间:2015-11-02 23:03:45

标签: java apache-kafka

我有两个Kafka经纪人:server1:9092和server2:9092 我使用Java客户端向此集群发送消息,这是代码:

@Test
public void sendRecordToTopic() throws InterruptedException, ExecutionException {

    //See at http://kafka.apache.org/documentation.html#newproducerconfigs
    Properties props = new Properties();
    props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
            "server1:9092,server2:9092");
    props.put(ProducerConfig.ACKS_CONFIG, "1");
    props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
    props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");

    KafkaProducer<String, String> producer = new KafkaProducer<String, String>(props);

    ProducerRecord<String, String> myRecord =
            new ProducerRecord<String, String>("my-replicated-topic", "test", "someValue");

    boolean syncSend = true;

    if (syncSend) {
        //Synchronously send
        producer.send(myRecord).get();
    } else {
        //Asynchronously send
        producer.send(myRecord);
    }
    producer.close();
}

当其中一个经纪人失败时,测试会在某些情况下抛出此异常(在此例外情况下&#39; server1&#39;已关闭):

  

2015-11-02 17:59:29,138警告   [org.apache.kafka.common.network.Selector] I / O出错   server1 / 40.35.250.227 java.net.ConnectException:拒绝连接:   没有进一步的信息   sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)at   sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)     在org.apache.kafka.common.network.Selector.poll(Selector.java:238)     在   org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:192)     在   org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:191)     在   org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:122)     在java.lang.Thread.run(Thread.java:745)

2 个答案:

答案 0 :(得分:0)

这就是我解决问题的方法:

  • 至少需要3个ZooKeeper节点,我还需要再配置一个。这是因为ZK确定领导者的方式,它需要更多的50%的节点启动和运行。

  • 将此参数添加到ZooKeeper属性文件中:

    滚动时间= 200

此参数是使用其他参数所必需的:

initLimit=5
syncLimit=2
  • 在Producer中添加此属性:

    props.setProperty(ProducerConfig.RECONNECT_BACKOFF_MS_CONFIG,&#34; 10000&#34;);

使用"RECONNECT_BACKOFF_MS_CONFIG"属性,WARN只抛出一次(不是无限循环),然后发送消息

答案 1 :(得分:0)

我遇到了这个确切的问题,事实证明原因是对其中一个新配置属性的误解。

在从先前的生成器API迁移时,我查找了与“topic.metadata.refresh.interval.ms”等效的内容,并确定了ProducerConfig.METADATA_FETCH_TIMEOUT_CONFIG。然而,在尝试访问元数据被认为是失败之前,事实证明这是超时,并且因为我将其设置为几分钟,所以它阻止了故障转移的发生。

将此设置为较低的值(我选择500毫秒)似乎解决了我的问题。

我认为我最初寻找的价值是ProducerConfig.METADATA_MAX_AGE_CONFIG作为元数据刷新前的超时,无论是否发生了故障