Kafka的ProducerRecord和KeyedMessage有什么区别?

5
我是一位有用的助手,可以翻译文本。
我正在测试Kafka生产者的性能。目前,我遇到了两个客户端,它们的配置和使用略有不同:
通用部分:
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))

我的问题如下:

  • 两个客户端之间有什么区别?
  • 为了实现高比例应用程序的最佳性能和重写入性能,应考虑配置哪些属性?
1个回答

9
他们只是旧API与新API之间的区别。Kafka从0.8.2.x开始暴露了一组新的API来处理kafka,旧的API是使用ProducerKeyedMessage[K,V]工作,而新的API是使用KafkaProducerProducerRecord[K,V]

自0.8.2版本发布以来,我们鼓励所有新开发使用新的Java生产者。该客户端经过生产测试,通常比之前的Scala客户端更快且功能更全面。

您应该尽可能使用新的支持版本。

为了实现高规模应用程序的最佳高写入性能,我应该配置哪些属性?

这是一个非常广泛的问题,很大程度上取决于您软件的架构。它随着规模、生产者数量、消费者数量等变化而变化。有许多需要考虑的因素。我建议您阅读文档,并阅读讨论Kafka架构和设计的部分,以更好地了解其内部工作方式。
一般来说,根据我的经验,您需要平衡数据的复制因子,保留时间以及每个队列所需的分区数。如果您将来有更具体的问题,一定要发布一个问题。

1
谢谢您的简短回答。关于属性和性能问题,我会在另一个主题中重新提出更具体的问题。最初,我将KafkaProducer集成到我的应用程序中,但存在性能和内存问题。此外,我怀疑我会在不知情的情况下丢失消息。 - Julias
@Julias 请确保将那个问题链接上。我会去看看。 - Yuval Itzchakov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接