I want to suggest kafka should create only one instance of ZkClient globally because ZkClient is thread safe and it will make many users easily customize kafka source code for Zookeeper.
In our company's cloud environment, it is not recommended to create ZkClient from zkConnect string directly because zookeeper cluster can be dynamically changing. So, I have to create ZkClient using our company's own platform library. Because of this requirement, I can't use kafka jar file directly. I can modify and build kafka source code but I have to repeat this work whenever I update kafka version, pretty annoying. So, my suggestion is, let me pass ZkClient outs of Producer, Consumer, and Broker, as the following example. Producer<String, String> producer = ProducerBuilder.withZkClient(zkClient).build<String,String>(producerConfig); ConsumerConnector connector = Consumer.withZkClient(zkClient).createJavaConsumerConnector(new ConsumerConfig(consumerProps)); KafkaServer is a little more complicated but I believe without much effort we can refactor KafkaServer to be customized with ZkClient. I really appreciate if this suggestion is accepted and merged to 0.8. If you want me to contribute with this suggestion, please let me know your opinion. If you are positive with this idea, I will contribute very happily. Thank you Best, Jae