首页 > 解决方案 > 如何解决 Kafka Avro 反序列化问题

问题描述

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

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

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

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

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

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

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

在偏移量 0 处反序列化分区 test-reply-topic-0 的键/值时出错。如果需要,请寻找过去的记录以继续消费。原因:反序列化 id 6 的 Avro 消息时出错详细信息:发现空值,需要字节

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

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

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

提前谢谢了!

标签: javaapache-kafkaavroconfluent-platformconfluent-schema-registry

解决方案


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


推荐阅读