关于架构演变,推荐的 Avro 类型 namespace/name 命名方案是什么?
What is recommended Avro type namespace/name naming scheme with respect to schema evolution?
推荐的 avro 类型命名方案是什么,以便模式演进与向后和向前兼容以及模式导入一起工作?你如何命名你的类型?您使用了多少 Schema.Parser 个实例?每个架构一个,一个全局架构,还是任何其他架构?
命名空间/类型名称不需要特殊的命名方案来解决兼容性问题。
如果您需要重命名某些内容,这就是
的别名
据我所知,每个模式多次使用解析器会导致解析器维护的状态出现一些问题
所以从技术上讲,您有 2 个选项,每个选项都有自己的优点和缺点:
A) 将版本标识符包含到 namespace 或类型 name
B) 不要将版本标识符包含到 namespace 或键入 name
说明:如果你想使用模式进化,你不需要包括版本号,因为融合模式注册表和简单对象编码都使用命名空间,并使用某种hash/modified crc作为模式指纹.反序列化字节时,您必须知道 writer schema,然后可以将其演化为 reader schema。这两个不必具有相同的名称,因为模式解析不使用 namespace 或类型 name。 (https://avro.apache.org/docs/current/spec.html#Schema+Resolution) 另一方面,Schema.Parser
cannon 解析多个具有相同 Name
的模式,这是模式的完全限定类型,即 namespace.name。所以看你的usecase,你想用哪一个,都可以用。
ad A) 如果你确实包含版本标识符,你将能够使用相同的 Schema.Parser
解析两个(或所有)版本,这意味着,例如,这些模式将在 maven- 中一起处理avro-plugin(对不起,我不记得了,我是否只在单一配置下测试过它,或者如果我确实也使用了多个配置,你必须自己检查)。另一个好处是,如果需要,您可以在不同版本中引用相同类型。缺点是,每次版本升级后, namespace and/or type name 都会发生变化,您将不得不更改项目中的导入。作者和 reader 模式之间的模式解析应该有效,希望它会。
ad B) 如果不包含版本标识符,avro-maven-plugin 只能将一个版本编译成 java 个文件,并且项目中不能有一个全局 Schema.Parser
实例.为什么您只想拥有一个全局实例?如果您不遵循 bad&frequest 建议使用顶级联合在一个 avsc 文件中定义多种类型,这将很有帮助。好吧,也许在 confluent registry 中需要它,但如果你不使用那个,你肯定不必使用顶级联合。可以使用模式导入,当 Schema.Parser
需要先处理所有 导入 ,然后才是实际类型。如果你使用这些 imports,那么你必须为每组类型及其导入使用一个 Schema.Parser
实例。这在声明上有点麻烦,但它使您免于拥有顶级联合,它本身就有问题,而且原则上是不正确的。但是,如果您的项目不需要同时访问同一架构的多个版本,它可能比 A) 变体更好,因为您不必更改导入。如果您使用导入,也有可能组合模式。由于所有版本都有相同的命名空间,您可以将任意版本传递给 Schema.Parser
。因此,如果类型中存在某种 a-->b 关联,则可以使用 v2 b 并将其与 v3 a 一起使用。不确定这是否是典型用例,但有可能。
推荐的 avro 类型命名方案是什么,以便模式演进与向后和向前兼容以及模式导入一起工作?你如何命名你的类型?您使用了多少 Schema.Parser 个实例?每个架构一个,一个全局架构,还是任何其他架构?
命名空间/类型名称不需要特殊的命名方案来解决兼容性问题。
如果您需要重命名某些内容,这就是
的别名据我所知,每个模式多次使用解析器会导致解析器维护的状态出现一些问题
所以从技术上讲,您有 2 个选项,每个选项都有自己的优点和缺点:
A) 将版本标识符包含到 namespace 或类型 name B) 不要将版本标识符包含到 namespace 或键入 name
说明:如果你想使用模式进化,你不需要包括版本号,因为融合模式注册表和简单对象编码都使用命名空间,并使用某种hash/modified crc作为模式指纹.反序列化字节时,您必须知道 writer schema,然后可以将其演化为 reader schema。这两个不必具有相同的名称,因为模式解析不使用 namespace 或类型 name。 (https://avro.apache.org/docs/current/spec.html#Schema+Resolution) 另一方面,Schema.Parser
cannon 解析多个具有相同 Name
的模式,这是模式的完全限定类型,即 namespace.name。所以看你的usecase,你想用哪一个,都可以用。
ad A) 如果你确实包含版本标识符,你将能够使用相同的 Schema.Parser
解析两个(或所有)版本,这意味着,例如,这些模式将在 maven- 中一起处理avro-plugin(对不起,我不记得了,我是否只在单一配置下测试过它,或者如果我确实也使用了多个配置,你必须自己检查)。另一个好处是,如果需要,您可以在不同版本中引用相同类型。缺点是,每次版本升级后, namespace and/or type name 都会发生变化,您将不得不更改项目中的导入。作者和 reader 模式之间的模式解析应该有效,希望它会。
ad B) 如果不包含版本标识符,avro-maven-plugin 只能将一个版本编译成 java 个文件,并且项目中不能有一个全局 Schema.Parser
实例.为什么您只想拥有一个全局实例?如果您不遵循 bad&frequest 建议使用顶级联合在一个 avsc 文件中定义多种类型,这将很有帮助。好吧,也许在 confluent registry 中需要它,但如果你不使用那个,你肯定不必使用顶级联合。可以使用模式导入,当 Schema.Parser
需要先处理所有 导入 ,然后才是实际类型。如果你使用这些 imports,那么你必须为每组类型及其导入使用一个 Schema.Parser
实例。这在声明上有点麻烦,但它使您免于拥有顶级联合,它本身就有问题,而且原则上是不正确的。但是,如果您的项目不需要同时访问同一架构的多个版本,它可能比 A) 变体更好,因为您不必更改导入。如果您使用导入,也有可能组合模式。由于所有版本都有相同的命名空间,您可以将任意版本传递给 Schema.Parser
。因此,如果类型中存在某种 a-->b 关联,则可以使用 v2 b 并将其与 v3 a 一起使用。不确定这是否是典型用例,但有可能。