Microsoft Bond 架构演变最佳实践

Microsoft Bond schema evolution best practices

Microsoft Bond 是否有一些关于模式如何随时间演变的最佳实践?我想确保我们遵循最佳实践,以便我们具有双向兼容性(即允许我们的 Bond 类型将旧版本发展到当前版本,以及向后兼容性允许从新版本转换回旧版本)。我没有在文档中看到这个问题(例如 https://microsoft.github.io/bond/manual/bond_cs.html nor https://microsoft.github.io/bond/manual/compiler.html#idl-syntax ),尽管 Avro 等其他序列化框架在其文档中明确详细说明了这一点。

为了它的价值,我们正在用 .NET (C#/F#) 编写并打算最初使用 CompactBinaryWriter 和 CompactBinaryReader 格式。

例如,我想象一些沿着这些方向的指导:

  1. 字段名称会随时间变化,因为字段序号用于字段解析,而不是直接使用名称(SimpleJSON 除外)。我相信这是真的,是吗?
  2. 添加新的 "required" 字段需要您为该字段提供默认值
  3. 在较新版本中删除字段是可以的,前提是旧版本已分配默认值
  4. 如何更改字段类型?例如,一个字段是否可以从版本 1 中的字符串字段更改为版本 2 中的 int64?它可以从字符串更改为自定义联合(带有可选字段的自定义类型)吗?
  5. 还有其他推荐吗?

谢谢!

如果有任何针对此类 Microsoft Bond 问题的活跃论坛社区,我也会感兴趣,但我找不到...

我也不知道有任何明确的模式演化指南,这肯定是 Bond 文档中的一个空白。通过我自己与邦德的合作,我可以回答你的一些问题:

  1. 是的,字段名称可以更改,对 CompactBinary 格式来说重要的是字段序号。
  2. DefaultAttribute只对接口成员有效。您可以在没有进一步注释的情况下添加必填字段,但是在反序列化旧记录(不包含该必填字段)时,我预计会出现运行时错误。
  3. 您可以删除字段。默认值是通过其默认构造函数实例化包含对象并读取相应字段来确定的。但是,如果您删除必填字段,旧的 reader 将无法反序列化它(新的 reader 根本不会包含它)。
  4. 这是一个很大的禁忌。如果您需要更改字段的类型,请保留旧字段(如果需要,给它一个后缀 _Obsolete)并引入一个 "correct" 类型的新字段。

它的价值:您写道您正在使用 F#,一些特定于 F# 的更改正在进行中,请参阅 here。这将支持记录、联合和核心 F# 数据类型。

更新: Bond 文档中现在有 section on schema evolution

现在可以在此处找到 Bond 架构演变规则和最佳实践: https://microsoft.github.io/bond/manual/bond_cpp.html#schema-evolution https://microsoft.github.io/bond/manual/bond_cs.html#schema-evolution