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

T.弗兰兹

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

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

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

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

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

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

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

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

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

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

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

提前谢谢了!

T.弗兰兹

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章