java - 如何解决 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。
也许有人有一些提示问题可能是什么,我从几天以来一直在寻找这个问题并且没有找到解决方案。
提前谢谢了!
解决方案
回复晚了,请原谅。事实证明,存在反序列化问题的应用程序使用了旧生成的 java 类。所以它使用了以前没有联合类型的旧模式。
推荐阅读
- serialization - 序列化数据库中的数据
- django - Django注释:最大异物的总和
- cypress - 访问“it”“测试用例”中的夹具数据
- javascript - CSS 格式不适用于 window.print()
- javascript - Core 2.2:在父网站窗口内打开子网站并处理来自子网站的事件
- node.js - 使用 npm 安装 expo-cli 时遇到问题
- python - 如何解码这种整数格式?
- visual-studio - Visual Studio 2019 Azure 调试 - 远程调试
- spring - 如何将 /*+Parallel*/ 添加到休眠名称查询
- python - 根据 QTableWidget 的突出显示行加载不同的 QWidget