我可以在使用后更改(Netflix)空心模型架构的字段内联吗?

时间:2018-02-19 21:44:40

标签: netflix netflix-hollow

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

我一直在考虑应用程序的生命周期,以及它随着时间的推移会如何发展和变化。我查看了空心文档中的notes on backwards compatibility,我认为我的问题没有在那里得到解决。

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

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

@HollowInline String title;

我确定通过将字段作为引用来改善我的服务,我可以删除内联注释吗?

String title;

或者,似乎更有可能会打破我的客户?

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

1 个答案:

答案 0 :(得分:1)

您猜测这是一个向后不兼容的更改。鉴于此架构:

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

int a1更改为Integer a1并删除@HollowInline注释是等效的。将现有字段从内联更改为引用或引用内联是一种重大的模式更改。

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

策略1

  1. 介绍一个新的字段名称;在您的示例中,您可以将其称为String titleRefString titleV2
  2. 使用相同的值填充titletitleV2
  3. 发布新的客户端API
  4. 一旦所有正在使用的应用/服务都已升级并切换为调用getTitleV2(),您就可以从架构中删除title并开始发布数据
  5. 策略2

    1. 鉴于:您使用命名空间或命名方案(例如以某种方式命名blob的路径并在主题名称下宣布您的版本)
    2. 对您的架构进行重大更改
    3. 更改或修改您的命名空间
    4. 站出一个新的制作人发布并宣布与旧制作人并行运行的新命名空间
    5. 发布新客户;接收这个新客户端的消费者应该被配置为使用新的命名空间(例如,可以将其添加到您与客户端一起发布的包装器中)
    6. 一旦所有消费的app / services都使用具有新命名空间的新客户端,退休旧生产者