我可以更改 (Netflix) Hollow 模型模式的字段内联吗?

Can I change a (Netflix) Hollow model schema's field inlining once it's in use?

我正在开发一种软​​件,可以将不经常更改的中型数据集传播到一组服务器。我正在使用 Netflix 的 Hollow 库来完成它。

我一直在思考我的应用程序的生命周期,以及它将如何随着时间的推移而增长和变化。我查看了 Hollow 文档中的 notes on backwards compatibility,但我认为我的问题没有得到解决。

在针对速度和内存效率调整我的模型时,我可以预见决定我通过 id 引用的字段会更好 inlined,反之亦然。

内联是否向后兼容?也就是说,如果我内联了一个字段:

@HollowInline String title;

我确定将该字段设为引用会更好,我可以只删除内联注释吗?

String title;

或者,更有可能的是,这会破坏我的客户吗?

我的假设是更改内联状态的唯一安全方法是添加一个具有所需内联状态的新字段,迁移我的生产者和消费者以使用它,然后删除旧的。

如您所料,这是一个向后的不兼容更改。鉴于此模式:

java class A { int a1; @HollowInline Integer a2; }

int a1 更改为 Integer a1 和删除 @HollowInline 注释是等效的。将现有字段从内联更改为引用或将引用更改为内联是一个破坏性架构更改。

一些策略可以解决这个问题:

策略 1

  1. 引入一个新的字段名称;在您的示例中,您可以将其称为 String titleRefString titleV2
  2. 用相同的值填充 titletitleV2
  3. 发布新客户端API
  4. 一旦所有消费 apps/services 都升级并切换到调用 getTitleV2(),您可以从架构中删除 title 并在没有它的情况下开始发布数据

策略2

  1. 鉴于:您使用命名空间或命名方案(例如以某种方式命名您的 blob 的路径并在主题名称下公布您的版本)
  2. 对您的架构进行重大更改
  3. 更改或修改您的命名空间
  4. 建立一个新的生产者,与旧的生产者
  5. 同时发布和宣布新的命名空间运行
  6. 发布一个新客户端;选择这个新客户端的消费者应该被配置为使用新的命名空间(例如,它可以被烘焙到您与客户端一起发布的包装器中)
  7. 一旦所有消费 app/services 都使用具有新名称空间的新客户端,淘汰旧生产者