在没有模式注册表的情况下处理 ksqlDB 中的 Avro

Handling Avro in ksqlDB without Schema Registry

我正在使用 不是 使用任何 Schema Registry.
的 Kafka 部署 所有主题中的事件是Avro。我可以访问模式,它只是没有存储在 Schema Registry.

现在,ksqlDB 文档explicitly say您必须有一个架构注册表才能处理 Avro 事件:

Stacks that have Schema Registry can use Avro- and Protobuf-encoded events in ksqlDB applications. Without Schema Registry, your ksqlDB applications can use only JSON or delimited formats.

我正在寻找解决此问题的方法,以便能够在这些 Avro 事件主题上定义 ksqlDB 流和表。我的想法很少,想知道它们是否有效,或者是否有其他解决方案

想知道是否有具体示例说明如何实现这些。

在这种情况下,强烈建议使用架构注册表。它是一个独立的 JVM 部署(就像 ksqlDB 一样),具有与 ksqlDB 相同的许可(Confluent Community Licence)。事实上,一推,您甚至可以 运行 它与 ksqlDB 在同一台机器上。

除了 运行 Schema Registry 比下面的解决方案更容易这一事实,如果不使用 Schema Registry,您将失去它的所有好处(兼容性检查,[=26] 之间的松散耦合=], 等等等等)


但是,如果您绝对不能 运行 Schema Registry,那么您的出发点就是了解您在 Kafka 主题上拥有的 Avro 是如何被序列化的。如果它与 Schema Registry 序列化器一起使用(Kafka 主题上的 Avro 数据通常是这样的),那么您将需要首先使用可用于客户端库(例如 Java)的 Schema Registry 反序列化器对其进行反序列化。 如果它只是带有单独 avsc 的二进制 Avro(听起来可能是这样),那么您就可以这样阅读它。

如果您想将数据与 ksqlDB 一起使用,那么我认为您将其重新序列化为 JSON 的建议可能是最好的选择。

因此,您需要自定义消费者读取 Avro,使用您持有的模式反序列化,然后自定义生产者以 JSON 写入新的 Kafka 主题。

从那里您可以使用 ksqlDB 读取 JSON 数据,只是增加了必须手动输入您在 Avro 中已有的模式的烦恼;)

CREATE STREAM my_source (COL1 VARCHAR, 
                         COL2 BIGINT) 
  WITH (KAFKA_TOPIC='my_json_topic', 
        VALUE_FORMAT='JSON');