2015-11-02 52 views
0

我有兩個卡夫卡經紀人:服務器1:9092和server2:9092 我使用的是Java客戶端發送消息到這個集羣,這是代碼:的ConnectException當集羣中的一個卡夫卡券商下來

@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(); 
} 

當經紀商之一是倒在一些情況下,測試引發此異常(在此異常例如「server1的」是向下):

2015年11月2日17:59:29138 WARN [有機.apache.kafka.common.network.Selector] I/O錯誤, server1/40.35.250.2 27 java.net.ConnectException:連接被拒絕: 處 sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717) sun.nio.ch.SocketChannelImpl.checkConnect(本機方法)沒有進一步的信息在組織.apache.kafka.common.network.Selector.poll(Selector.java:238) at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:192) at org.apache.kafka.clients .producer.internals.Sender.run(Sender.java:191) at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:122) at java.lang.Thread.run( Thread.java:745)

回答

0

這是我解決問題的方式:

  • 至少3 ZooKeeper的節點要求,我必須配置一個。這是因爲ZK確定領導者的方式,它需要更多的50%的節點啓動並運行。

  • 添加此參數來動物園管理員屬性文件: 滾動時間= 200 此參數是必需使用這些其它參數: initLimit = 5 syncLimit = 2

  • 在Producer添加此屬性: 道具。 setProperty(ProducerConfig.RECONNECT_BACKOFF_MS_CONFIG,「10000」);

隨着「RECONNECT_BACKOFF_MS_CONFIG」屬性WARN拋出只有一次(而不是無限循環),然後將消息發送

0

我有這個確切的問題,事實證明,原因是一種誤解新的配置屬性之一。

在從先前的生產者API遷移時,我尋找與「topic.metadata.refresh.interval.ms」等效的東西,並在ProducerConfig.METADATA_FETCH_TIMEOUT_CONFIG上解決。然而,在嘗試訪問元數據之前,這被認爲是失敗,並且由於我將其設置爲幾分鐘,所以它阻止了故障轉移的發生。

將此設置爲較低的值(我選擇了500毫秒)似乎已解決了我的問題。

我認爲我最初尋找的值是ProducerConfig.METADATA_MAX_AGE_CONFIG,因爲元數據刷新前的超時時間與是否發生故障無關