2015-04-07 44 views
14

我使用0.8.2.1 kafka-clients庫連接到Kafka。當卡夫卡上線時,我能夠成功連接,但當卡夫卡倒閉時,我想優雅地處理失敗。下面是我的配置:我如何優雅地處理卡夫卡中斷?

kafkaProperties.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaUrl); 
kafkaProperties.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); 
kafkaProperties.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); 
kafkaProperties.setProperty(ProducerConfig.RETRIES_CONFIG, "3"); 
producer = new KafkaProducer(kafkaProperties); 

當卡夫卡下來,我得到了我的日誌以下錯誤:

WARN: 07 Apr 2015 14:09:49.230 org.apache.kafka.common.network.Selector:276 - [] Error in I/O with localhost/127.0.0.1 
java.net.ConnectException: Connection refused 
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[na:1.7.0_75] 
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:739) ~[na:1.7.0_75] 
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_75] 

在無限循環中重複這個錯誤,並鎖定了我的Java應用程序。我嘗試了與超時,重試和確認有關的各種配置設置,但是我一直無法防止發生這種循環。

有沒有可以防止這種情況的配置設置?我需要嘗試不同版本的客戶端嗎?如何優雅地處理Kafka中斷?

回答

20

我想通了,這種設置組合使卡夫卡客戶端迅速失敗,但不會持有線程或垃圾郵件日誌:

kafkaProperties.setProperty(ProducerConfig.METADATA_FETCH_TIMEOUT_CONFIG, "300"); 
kafkaProperties.setProperty(ProducerConfig.TIMEOUT_CONFIG, "300"); 
kafkaProperties.setProperty(ProducerConfig.RETRY_BACKOFF_MS_CONFIG, "10000"); 
kafkaProperties.setProperty(ProducerConfig.RECONNECT_BACKOFF_MS_CONFIG, "10000"); 

我不喜歡的是,卡夫卡客戶持有,同時試圖連接到該線程卡夫卡服務器,而不是完全異步,但這至少是功能。

+0

非常有幫助,謝謝。這是正式記錄在任何地方? – maxenglander

+0

@maxenglander:不是我看到的。我不得不通過代碼去探索,並且有很多嘗試和錯誤。 –

+0

「而不是完全異步」 – vbence

0

在0.9客戶端中,還有max.block.ms屬性,這將限制允許客戶端運行的時間。