繁体   English   中英

在具有多个主题和 SubjectNameStrategy 的应用程序中使用 kafka 和 schema-registry

[英]using kafka with schema-registry, in app with multiple topics and SubjectNameStrategy

首先,我或多或少地找到了一种方法来做到这一点。 但这确实是糟糕的代码。 因此,如果存在这种方法,我正在寻找如何更好地解决此问题的建议。

放置一些可以使用的东西。 假设您有应用程序,它将avro发送到n 个主题并使用架构注册表。 假设(起初)您不想使用 avro 联合​​,因为它们会带来一些问题。 N-1 个主题很简单,每个主题 1 个模式。 但是,你有数据,你需要按顺序发送,这意味着 1 个主题和指定的组键,但这些数据没有相同的架构。 所以要做到这一点,你需要在模式注册表中为每个主题注册多个模式,这意味着使用key.subject.name.strategy=io.confluent.kafka.serializers.subject.RecordNameStrategy或类似的。 在这里它变得丑陋。

但该设置是针对每个架构注册表实例的,因此您必须声明 2 个(或更多)架构注册表实例,每个 SubjectNameStrategy 键/值组合一个。 这将起作用。

但是,根据文档,RecordNameStrategy 仅适用于 Java 平台(!),因此如果您想创建非特定于语言的服务(您最有可能在 2021 年这样做......),您不能使用记录名称策略。

因此,如果您不能使用 RecordNameStrategy,并且由于某种原因您仍然想使用 avro 和模式注册表,那么 IIUC 除了在顶级使用 avro 联合​​并使用TopicNameStrategy ,现在很好,因为您有单一联合模式。 但是过去顶级联合对我来说并不好,因为反序列化器自然不知道您想从数据中反序列化哪种类型。 因此,理论上摆脱这种情况的一种方法可能是使用 Cloudevents 标准(或类似的东西),根据使用联合中的哪种类型来序列化数据来设置 cloudevent type属性,然后使用 type->deserializer 映射,以便能够选择在收到的 cloudevents 消息中为 avro 编码的数据正确解串器。 这将起作用,而且不仅适用于 java。

所以总结一下,这里有 2 个针对非常简单问题的一般描述的解决方案。 但老实说,对于广泛接受的解决方案(avro/schema-registry)来说,这些似乎非常复杂。 我想知道,是否有更简单的方法来解决这个问题。

这是一个常见的主题,特别是在类似 CQRS 的系统中,其中命令可以被排序(例如,在更新或删除之前创建等)。 在这些情况下,使用 Kafka,通常不希望在多个主题上发布消息。 您是正确的,在同一主题上发送具有多个模式的消息有两种解决方案:avro 模式中的顶级联合,或每个主题有多个模式。

你说你不想在模式中使用顶级联合,所以我将解决每个主题有多个模式的情况。 您是正确的,这排除了使用任何仅包含主题名称来定义主题的主题命名策略。 所以TopicNameStrategy出来了。

但是,根据文档,RecordNameStrategy 仅适用于 Java 平台(!),因此如果您想创建非特定于语言的服务(您最有可能在 2021 年这样做......),您不能使用记录名称策略。

这值得一些澄清......在融合的方式中,“模式注册感知avro序列化器”首先根据主题名称在注册表中注册您的编写器模式以获得模式ID。 然后,在发布到 kafka 之前,他们在您的 avro 字节前加上该架构 ID。 请参阅https://docs.confluent.io/platform/current/schema-registry/serdes-develop/index.html#wire-format 上的“Confluent Wire 格式”。

所以主题命名是序列化库中的一个选择; 反序列化器只是通过 kafka 消息前缀的 id 解析模式。 融合的 Java 序列化程序使此主题命名可配置并定义策略TopicNameStrategyRecordNameStrategyTopicRecordNameStrategy 请参阅https://docs.confluent.io/platform/current/schema-registry/serdes-develop/index.html#subject-name-strategy 这三种策略是定义“范围”的约定,即在注册表中测试哪些模式的兼容性(每个主题、每个记录或组合)。 您已经确定RecordNameStrategy适合每个主题具有多个 avro 模式的用例。

但是,我认为您对RecordNameStrategy非 Java 支持的担忧可以搁置一旁。 在序列化器中,主题命名可以自由实现,无论序列化器开发人员如何选择。 在 Java、Python、Go 和 NodeJS 中处理过这些东西后,我在第三方序列化程序在这方面的工作方式方面经历了一些变化。 尽管如此,工作的非 Java 库确实存在。

如果所有其他方法都失败了,您可以编写自己的“模式注册感知序列化程序”,在为 Kafka 编码汇流线格式之前,使用您选择的主题名称注册模式。 通过遵循一种众所周知的融合策略,我从其他工具中获得了满意的结果,因此我建议您模仿它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM