2017-10-06 127 views
1

我是卡夫卡新手,我有一個問題,我無法解決。卡夫卡生產商很慢

我在我自己的計算機中安裝了Kafka和Zookeeper(不在Linux中),並且我創建了一個包含多個分區(在6和12分區之間播放)的主題的代理。

當我創建消費者時,他們完美地工作並且以良好的速度閱讀,但是提到生產者,我創建了許多網站中可以看到的簡單生產者。生產者在一個循環內併發送很多短消息(大約2000個非常短的消息)。

我可以看到消費者非常quicly地讀取2000條消息,但生產者以每秒140條或150條消息的速度向代理髮送消息。正如我之前所說的,我正在自己的筆記本電腦上工作(只有1個磁盤),但是當我每秒鐘讀取數百萬條消息時,我認爲我忘記了一些東西,因爲我距離光年遠。

如果我使用更多的生產者,結果會更糟。

是在同一個節點或類似的更多經紀人的問題?這個問題在我的工作中已經強加於我,我沒有更好的計算機的可能性。

創建生產者的代碼是

public class Producer { 

    public void publica(String topic, String strKey, String strValue) { 
     Properties configProperties = new Properties(); 
     configProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); 
     configProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); 
     configProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); 

     KafkaProducer<String, String> producer = new KafkaProducer<String, String>(configProperties); 
     ProducerRecord<String, String> rec = new ProducerRecord<String, String>(topic, strValue); 
     producer.send(rec); 
    } 
} 

和發送消息的代碼是(部分):

Producer prod = new Producer(); 

for (int i = 0; i < 2000; i++) 
{ 
    key = String.valueOf(i); 
    prod.publica("TopicName", key, texto + " - " + key); 
    // System.out.println(i + " - " + System.currentTimeMillis()); 
} 
+0

你可以發佈你的代碼用於生產嗎? 我會假設你正在同步生產 - 你應該異步生產。磁盤應該不是問題(刷新到磁盤是在後臺完成) – Treziac

+0

是的,我編輯了我的帖子。非常感謝 –

回答

6

您可以一次創建卡夫卡製片人,並用它每次你需要時間發送消息:

public class Producer { 
    private final KafkaProducer<String, String> producer; // initialize in constructor 

    public void publica(String topic, String strKey, String strValue) { 
     ProducerRecord<String, String> rec = new ProducerRecord<String, String>(topic, strValue); 
     producer.send(rec); 
    } 
} 

另外看看生產者和經紀人配置availab le here。有幾種選擇可以根據您的應用程序需求進行調整。

+0

我現年54歲,從22歲開始就是開發者,有時我覺得自己是初學者。我沒有意識到卡夫卡製片人是每次都創作的,而不是一次。我做出改變並且... –

+0

之前:在15秒內2000 msg。之後:約170毫秒的2000條消息。很多很多謝謝 –

+0

@ EnriqueLópezMoreno - 請接受並投票回答。 – alirabiee