键控和非键控 ProducerRecords 的 KafkaProducer
KafkaProducer for both keyed and unkeyed ProducerRecords
我在 Scala 中使用 0.9 Kafka Java 客户端。
scala> val kafkaProducer = new KafkaProducer[String, String](props)
ProducerRecord
有几个构造函数,允许您包含或不包含键 and/or 分区。
scala> val keyedRecord = new ProducerRecord("topic", "key", "value")
scala> kafkaProducer.send(keyedRecord)
应该没有问题。
然而,未加密的 ProducerRecord
给出类型错误。
scala> val unkeyedRecord = new ProducerRecord("topic", "value")
res8: org.apache.kafka.clients.producer.ProducerRecord[Nothing,String] =
ProducerRecord(topic=topic, partition=null, key=null, value=value
scala> kafkaProducer.send(res8)
<console>:17: error: type mismatch;
found : org.apache.kafka.clients.producer.ProducerRecord[Nothing,String]
required: org.apache.kafka.clients.producer.ProducerRecord[String,String]
Note: Nothing <: String, but Java-defined class ProducerRecord is invariant in type K.
You may wish to investigate a wildcard type such as `_ <: String`. (SLS 3.2.10)
kafkaProducer.send(res8)
^
这是否违反了 Kafka 的规则,或者它可能是在 Scala 中使用此 Java API 的不必要的预防措施?
更根本的是,将键控和非键控消息放在同一个 Kafka 主题中是一种糟糕的形式吗?
谢谢
Java文档:http://kafka.apache.org/090/javadoc/org/apache/kafka/clients/producer/package-summary.html
编辑
可以更改 KafkaProducer
中参数 K
的方差来解决这个问题吗?
看起来答案在评论中,但要说明的是,Scala 在未明确提供类型时使用类型推断。由于您写道:
val unkeyedRecord = new ProducerRecord("topic", "value")
key没有提供,变成null,Scala的类型系统推断是一个Nothing实例。要解决此问题,请显式声明类型:
val unkeyedRecord = new ProducerRecord[String,String]("topic", "value")
我在 Scala 中使用 0.9 Kafka Java 客户端。
scala> val kafkaProducer = new KafkaProducer[String, String](props)
ProducerRecord
有几个构造函数,允许您包含或不包含键 and/or 分区。
scala> val keyedRecord = new ProducerRecord("topic", "key", "value")
scala> kafkaProducer.send(keyedRecord)
应该没有问题。
然而,未加密的 ProducerRecord
给出类型错误。
scala> val unkeyedRecord = new ProducerRecord("topic", "value")
res8: org.apache.kafka.clients.producer.ProducerRecord[Nothing,String] =
ProducerRecord(topic=topic, partition=null, key=null, value=value
scala> kafkaProducer.send(res8)
<console>:17: error: type mismatch;
found : org.apache.kafka.clients.producer.ProducerRecord[Nothing,String]
required: org.apache.kafka.clients.producer.ProducerRecord[String,String]
Note: Nothing <: String, but Java-defined class ProducerRecord is invariant in type K.
You may wish to investigate a wildcard type such as `_ <: String`. (SLS 3.2.10)
kafkaProducer.send(res8)
^
这是否违反了 Kafka 的规则,或者它可能是在 Scala 中使用此 Java API 的不必要的预防措施?
更根本的是,将键控和非键控消息放在同一个 Kafka 主题中是一种糟糕的形式吗?
谢谢
Java文档:http://kafka.apache.org/090/javadoc/org/apache/kafka/clients/producer/package-summary.html
编辑
可以更改 KafkaProducer
中参数 K
的方差来解决这个问题吗?
看起来答案在评论中,但要说明的是,Scala 在未明确提供类型时使用类型推断。由于您写道:
val unkeyedRecord = new ProducerRecord("topic", "value")
key没有提供,变成null,Scala的类型系统推断是一个Nothing实例。要解决此问题,请显式声明类型:
val unkeyedRecord = new ProducerRecord[String,String]("topic", "value")