根据AVRO参考文档有两种编码:二进制和JSON编码,但是在大多数avro消息Kafka生产者脚本示例中,它从未指定使用哪种编码,我需要一个以二进制编码发送avro的示例和另一个以JSON编码发送AVRO到kafka的例子,进行一些测试,谢谢!
avro消息Kafka生产者脚本的大多数示例,从未指定使用哪种编码
我见过的所有示例都使用二进制。具体来说,Confluence(或 Apicurio 或 AWS Glue)都使用使用 Avro API
BinaryEncoder
类的类。如果您想使用 Avro,只需使用架构注册表即可;这比您自己管理模式要容易得多。
没有理由在 Kafka 中真正使用“Avro JSON 编码”。二进制数据格式更紧凑、更快。但 Avro 文档已经展示了如何创建 JSONEncoder 类并向其传递
ByteArrayOutputStream
。除了将 ByteArraySerializer
与生产者一起使用之外,Kafka 没有什么特别的。
Confluence avro 库(io.confluence:kafka-avro-serializer)确实不提供 Avro 数据 JSON 编码的选项。它明确使用二进制 Avro 编码,没有配置使用 json 编码的选项:
AbstractKafkaAvroSerializer
org.apache.avro.io.EncoderFactory
的实例
encoderFactory.directBinaryEncoder(out, null)
对数据进行编码。AbstractKafkaAvroDeserializer
org.apache.avro.io.DecoderFactory
的实例
decoderFactory.binaryDecoder(buffer)
解码数据。我无法解释为什么这可能是因为二进制编码的数据更加紧凑......看来如果你想使用 JSON 编码的 Avro 生产者和所有消费者将需要使用不同的库来编写并阅读 Kafka 主题。我没有提供开源库选项,您可能需要自己推出。
如果在您的组织内期望所有与您的主题交互的 Kafka 消费者(和生产者)不使用汇合库是不现实的,那么您将需要坚持使用二进制编码的 Avro。