gpt4 book ai didi

scala - KafkaProducer 用于有键和无键的 ProducerRecords

转载 作者:行者123 更新时间:2023-12-04 18:58:27 26 4
gpt4 key购买 nike

我在 Scala 中使用 0.9 Kafka Java 客户端。

scala> val kafkaProducer = new KafkaProducer[String, String](props)
ProducerRecord有几个构造函数允许您包含或不包含键和/或分区。
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 主题中是不是很糟糕?

谢谢

Javadoc: http://kafka.apache.org/090/javadoc/org/apache/kafka/clients/producer/package-summary.html

编辑

可以改变参数 K的方差在 KafkaProducer解决这个问题?

最佳答案

看起来答案就在注释中,但为了说明这一点,当未明确提供类型时,Scala 会使用类型推断。既然你写道:

val unkeyedRecord = new ProducerRecord("topic", "value")

没有提供键,它变成了 null,Scala 的类型系统推断它是一个 Nothing 实例。要解决这个问题,请明确声明类型:
val unkeyedRecord = new ProducerRecord[String,String]("topic", "value")

关于scala - KafkaProducer 用于有键和无键的 ProducerRecords,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35075554/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com