2016-03-14 238 views
2

我測量卡夫卡生產者生產性能之間的差異。 目前我見過兩個客戶端與位不同的配置和使用情況:就是卡夫卡ProducerRecord和KeyedMessage

常見:

def buildKafkaConfig(hosts: String, port: Int): Properties = { 
    val props = new Properties()  
    props.put("metadata.broker.list", brokers) 
    props.put("serializer.class", "kafka.serializer.StringEncoder") 
    props.put("producer.type", "async") 
    props.put("request.required.acks", "0") 
    props.put("queue.buffering.max.ms", "5000") 
    props.put("queue.buffering.max.messages", "2000") 
    props.put("batch.num.messages", "300") 
    props 
} 

第一個客戶:

"org.apache.kafka" % "kafka_2.11" % "0.8.2.2" 

用法:

val kafkaConfig = KafkaUtils.buildKafkaConfig("kafkahost", 9092) 
val producer = new Producer[String, String](new ProducerConfig(kafkaConfig)) 

// ... somewhere in code 
producer.send(new KeyedMessage[String, String]("my-topic", data)) 

第二個客戶端:

"org.apache.kafka" % "kafka-clients" % "0.8.2.2" 

用法:

val kafkaConfig = KafkaUtils.buildKafkaConfig("kafkahost", 9092) 
val producer = new KafkaProducer[String, String](kafkaConfig) 
// ... somewhere in code 
producer.send(new ProducerRecord[String, String]("my-topic", data)) 

我的問題是:

  • 是什麼2個客戶端之間的區別?
  • 我應該配置哪些屬性,考慮到以達到最佳,高重寫入性能,高擴展應用程序?

回答

4

是什麼2個客戶端之間的區別?

它們只是old vs new APIs。卡夫卡開始0.8.2.x曝光了一組新的API與卡夫卡的工作,舊的是ProducerKeyedMessage[K,V]在新的API是工作KafkaProducerProducerRecord[K,V]

隨着0.8.2版本的,我們鼓勵所有新的開發使用 新的Java生產者。這個客戶端經過生產測試,通常比以前的Scala客戶端更快,功能更全面。

你最好應使用新的支持的版本。

我應該配置哪些屬性,考慮到實現 最佳,高重寫入性能,高擴展應用程序?

這是一個非常寬泛的問題,它很大程度上取決於軟件的體系結構。它隨着規模,生產者數量,消費者數量等而變化。有許多事情需要考慮。我建議通過the documentation並閱讀關於Kafka的架構和設計的章節,以更好地瞭解它在內部的工作原理。

一般來說,從我的經驗,你需要平衡你的數據的複製因子,保留時間和每個隊列進入分區的號碼。如果你有更具體的問題,你肯定應該發表一個問題。

+1

謝謝你的簡要回答。關於屬性和性能問題我將在另一個線程中更改更具體的問題。最初,我已將KafkaProducer集成到我的應用程序中,但存在性能和內存問題。此外,我懷疑我沒有「知道」這個郵件而丟失郵件 – Julias

+0

@Julias請確保鏈接該問題。我會看看。 –