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

How to solve Kafka Avro deserializing problem

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

我们有一台服务器,其融合安装是 运行。所有都是手动配置的,所以没有使用 confluent cli。

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

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

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

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

我的测试回复主题包含一个 "union{null, bytes} file" 字段。所以该字段是可选的,默认值为空,然后在注册表中注册架构。现在,如果文件值为空,它会给我一个错误:

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 bytes。所以我在生产者和消费者中使用相同的 kafka 代理,相同的 API 和相同的值。 它正在从服务器和本地计算机上的注册表请求相同的架构 ID。

也许有人暗示了问题可能是什么,我搜索了好几天这个问题,但没有找到解决方案。

非常感谢!

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