如何将Akka Stream of Case类直接保存到Kafka?

时间:2017-01-18 11:40:06

标签: scala apache-kafka akka-stream

我能够以String的形式将我的数据保存到Kafka:

 val producerSettings = ProducerSettings(actorSystem, new StringSerializer, new StringSerializer)
    .withBootstrapServers("localhost:9092")


def kafkaSink(source: Source[ModbusMessage, NotUsed]) = source.map(a => s"Id:${a.sensorId}:Values:${a.values.mkString(",")}").map { m =>
    new ProducerRecord[String, String]("sampleData", m)
  }.
    runWith(Producer.plainSink(producerSettings))

,但有没有办法将我的case类直接保存到Kafka中。就像我想以My case类ModbusMessage的形式保存我的数据。

如果有人可以为我提供一个很棒的例子,那就很棒!

感谢。 感谢帮助!

1 个答案:

答案 0 :(得分:2)

Kafka的数据消息模型(由消息密钥和消息值组成)基于密钥和值的原始字节(byte[])。因此,您需要提供一个序列化程序,将您的案例类转换为byte[]。在上面的示例中,您已为键和值配置了使用StringSerializer,序列化程序会转换String -> byte[]

  

但有没有办法将我的case类直接保存到Kafka中。就像我想以My case类ModbusMessage的形式保存我的数据。

如果您有案例类ModbusMessage,则需要实施+配置ModbusMessage -> byte[]序列化程序。您可以自己实现这样的序列化程序,但正如其他人对您的问题发表评论一样,您也可以选择序列化框架,例如Avro或Protobuf。您可能还想查看例如https://github.com/scala/pickling

  

我是否需要使用类似liftJson的库将其转换为Json,然后将其保存为Kafka中的String?

不,你不需要。您可以 - 并且很可能也应该 - 直接从您的案例类ModbusMessage转换为byte[](并且,对于反序列化,在相反的方向)。将您的案例类首先转换为JSON没有意义,因为JSON表示也必须序列化为byte[],以便可以将其发送到Kafka(因此您需要两次这里的转换成本。)