Kakfa-字符串序列化为avro-如何反序列化?

时间:2019-08-20 08:49:38

标签: apache-kafka apache-kafka-streams

我有两个应用程序-其中一个生成针对该主题的消息,另一个从中读取。在生产者中,我将key-serializer设置为:

spring.kafka.producer.key-serializer=io.confluent.kafka.serializers.KafkaAvroSerializer

但是作为消息中的关键,我发送了字符串。因此,在Zookeper中创建了一个新的模式

"string"

现在,当我想在kafka流中使用消息时,我不知道应该使用哪个Serde-普通的StringSerde或SpecificAvroSerde?

当我使用字符串Serde时,我得到了一些错误的键,例如,我在键中得到了一些其他数字,这些数字仅应为字母。

如何在不更改生产者中的序列化程序的情况下解决问题?

1 个答案:

答案 0 :(得分:1)

我将巩固我的评论。

我相信您在输出中看到的是数字,然后看到字符串,因为使用的应用程序正在将Avro二进制数据视为字符串。但是将数据序列化为Avro二进制文件可以在前面添加数字(字符串数据类型的字符串长度)

http://avro.apache.org/docs/current/spec.html#binary_encode_primitive(请参阅字符串)

因此,我怀疑您的数据已序列化为Confluent的各种Avro二进制文件,而这些是密钥中的字节。如果您的消费应用程序想要对Avro二进制格式进行反序列化,则需要在消费应用程序中使用成对的Confluent解串器。成对汇合的Avro解串器的结果是Avro通用数据记录。然后,可以以编程方式从Avro通用数据记录中检索您的字符串。

请注意,成对的汇合解串器需要以某种方式传递给您的架构注册表URL,以便它可以查找用于反序列化的架构。我不确定您使用的应用程序基础架构如何实现。

希望这会有所帮助!