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

时间:2018-09-07 14:15:37

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

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

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

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

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

所以总结一下: 服务器1(融合安装) 服务器2(请求使用者和答复生产者应用程序) 服务器3(请求发送方和答复消费者应用程序)

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

我的test-reply-topic包含一个“ union {null,bytes}文件”字段。因此,该字段是可选的,默认值为null,然后在注册表中注册架构。现在,如果文件值为null,则会给我一个错误:

  

在以下位置反序列化分区test-reply-topic-0的键/值时出错   偏移量0。如有需要,请查找记录以继续   消费。原因:反序列化ID为6的Avro消息时出错   详细:发现为空,需要字节

如果它包含字节,那么它可以正常工作。

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

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

非常感谢!

1 个答案:

答案 0 :(得分:1)

抱歉,我的回复很晚。结果发现,存在反序列化问题的应用程序使用了旧的生成的Java类。因此,它使用了以前没有联合类型的旧模式。