【发布时间】:2019-02-12 22:00:22
【问题描述】:
我们在使用 kafka avro 消费者和生产者的应用程序中出现了一个非常奇怪的行为。
我们有一台正在运行融合安装的服务器。全部都是手动配置的,所以没有使用 confluent cli。
在第二台服务器上,有一个应用程序正在运行,它使用这个融合安装来通过 Kafka 主题接收请求。该请求被转换为数据库查询,并返回一个包含特定数据的回复主题。
在第三台服务器上有另一个应用程序,该应用程序将此请求发送到服务器 2 上的应用程序并接收回复主题。
总结一下: 服务器 1(融合安装) 服务器 2(请求消费者和回复生产者应用程序) 服务器 3(请求发送者和回复消费者应用程序)
我为我们开发了一个 kafka API,所有这些 API 都使用带有融合 avro 序列化器和反序列化器的消费者和生产者。 当我现在从服务器 3 上的应用程序生成请求主题时,服务器 2 上的应用程序接收请求,将其转换为数据库查询并发送回与请求主题不同的回复主题。 现在我在服务器 3 上的应用应该会收到 test-reply-topic 并对其进行反序列化。
我的 test-reply-topic 包含一个“union{null, bytes} 文件”字段。所以该字段是可选的,默认值为空,然后在注册表中注册模式。现在,如果文件值为 null,它会给我一个错误:
在反序列化分区 test-reply-topic-0 的键/值时出错 偏移量0。如果需要,请寻找过去的记录继续 消费。原因:反序列化 id 6 的 Avro 消息时出错 详细:发现为空,需要字节
如果它包含字节,它正在工作。
奇怪的是,如果我在本地计算机上尝试相同的操作,它正在使用 file=null 和 file=some 字节。所以我在生产者和消费者中使用相同的 kafka 代理、相同的 API 和相同的值。 它正在从服务器和本地计算机上的注册表中请求相同的模式 ID。
也许有人有一些提示可能是什么问题,我从几天以来一直在寻找这个问题并没有找到解决方案。
非常感谢!
【问题讨论】:
-
如果您可以为生产者和消费者共享完整的架构和代码,那将会很有用
-
您可能想尝试清除主题并尝试重新消费。这个错误一般发生在producer发送的和SR中注册的schema不匹配时。
-
抱歉我的回复晚了。事实证明,存在反序列化问题的应用程序使用了旧生成的 java 类。所以它使用了旧的模式,以前没有联合类型。
标签: java apache-kafka avro confluent-platform confluent-schema-registry