java - 如何解决Kafka Avro反序列化问题

标签 java apache-kafka avro confluent-platform confluent-schema-registry

我们使用 kafka avro 消费者和生产者的应用程序有一个非常奇怪的行为。

我们有一台正在运行融合安装的服务器。全部都是手动配置的,因此不使用 confluence cli。

在第二台服务器上,正在运行一个应用程序,该应用程序使用此融合安装通过 Kafka 主题接收请求。该请求被转换为数据库查询,并发送回带有特定数据的回复主题。

在第三台服务器上有另一个应用程序,该应用程序将此请求发送到 2 号服务器上的应用程序并接收回复主题。

总结一下: 服务器 1(Confluence 安装) 服务器 2(请求消费者和回复生产者应用程序) 服务器3(请求发送者和回复消费者应用程序)

我为我们开发了一个 kafka API,所有这些 API 都使用具有汇合 avro 序列化器和反序列化器的消费者和生产者。 当我现在从服务器 3 上的应用程序生成请求主题时,服务器 2 上的应用程序接收请求,将其转换为数据库查询并发回与请求主题不同的回复主题。 现在,我在服务器 3 上的应用程序应该接收 test-reply-topic 并将其反序列化。

我的测试回复主题包含一个“union{null, bytes} file”字段。所以该字段是可选的,默认值为null,然后schema被注册到注册表中。现在,如果文件值为 null,则会出现错误:

Error deserializing key/value for partition test-reply-topic-0 at offset 0. If needed, please seek past the record to continue consumption. Cause: Error deserializing Avro message for id 6 Detailed: Found null, expecting bytes

如果它包含字节,则它正在工作。

奇怪的是,如果我在本地计算机上尝试相同的操作,它会使用 file=null 和 file=some 字节。所以我在生产者和消费者中使用相同的 kafka 代理、相同的 API 和相同的值。 它正在从服务器和本地计算机上的注册表请求相同的架构 ID。

也许有人暗示了问题可能是什么,我几天来一直在寻找这个问题,但没有找到解决方案。

非常感谢!

最佳答案

抱歉我回复晚了。事实证明,存在反序列化问题的应用程序使用了旧的生成的 java 类。因此它使用旧的模式,以前没有联合类型。

关于java - 如何解决Kafka Avro反序列化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52224395/

相关文章:

java - Avro 与 Protobuf 性能对比

java - Play Framework 1.2.7 Heroku 更新崩溃

java - Spring REST API 的路由与映射术语

java - 验证 Kafka 主题中是否存在消息

apache-kafka - 汇合模式注册表 `UnknownTopicOrPartitionException: This server does not host this topic-partition.`

node.js - 分布式印象数据收集架构

java - 使用数据库中的数据创建自定义 ListView

java求两个列表之和的函数

apache-kafka - 无法运行 Kafka 服务器

json - 将字节数组转换为以 avro Schema 作为输入的 Json 会出错