退休定义的 Thrift API 的最佳实践?
Best practice to retire an defined Thrift API?
只是好奇下面的场景会发生什么?
- 在最新的 thrift 服务定义中删除了一个已定义的 API;
- 服务器端实现升级到最新定义(即不再有关于删除的API的实现);
- 一些客户端可能仍然停留在过时的服务定义上,并且有流量被删除 API。
作为一个更普遍的问题,是否有任何最实用的方法来淘汰现有的 API(即一旦在 .thrift 文件中定义)?
这是软版本控制的好处之一,它不是 Thrift 独有的功能。 API 可能会随着时间的推移而改变,只要遵守一组特定的、非常少的规则,应用程序就会有明确定义的行为方式。
关于 Thrift,这些规则包括永远不要更改任何给定结构成员或参数的特定字段 ID 的类型。服务名称和方法名称也是如此。数字 field/argument ID 和 service/method 名称是在线数据中使用的标识符。
因此,
- 如果 field/argument 的类型改变,数字 ID 也应该改变
- 已弃用的字段和方法应该进行注释,而不是从 IDL 中删除(以防止它们以后被重用)
最后一点值得一提的是 required
的用法:此属性不能从已发布的 API 结构成员 中删除。
否则,当老客户调用新服务时,您将 运行 陷入兼容性问题,反之亦然。
只是好奇下面的场景会发生什么?
- 在最新的 thrift 服务定义中删除了一个已定义的 API;
- 服务器端实现升级到最新定义(即不再有关于删除的API的实现);
- 一些客户端可能仍然停留在过时的服务定义上,并且有流量被删除 API。
作为一个更普遍的问题,是否有任何最实用的方法来淘汰现有的 API(即一旦在 .thrift 文件中定义)?
这是软版本控制的好处之一,它不是 Thrift 独有的功能。 API 可能会随着时间的推移而改变,只要遵守一组特定的、非常少的规则,应用程序就会有明确定义的行为方式。
关于 Thrift,这些规则包括永远不要更改任何给定结构成员或参数的特定字段 ID 的类型。服务名称和方法名称也是如此。数字 field/argument ID 和 service/method 名称是在线数据中使用的标识符。
因此,
- 如果 field/argument 的类型改变,数字 ID 也应该改变
- 已弃用的字段和方法应该进行注释,而不是从 IDL 中删除(以防止它们以后被重用)
最后一点值得一提的是 required
的用法:此属性不能从已发布的 API 结构成员
否则,当老客户调用新服务时,您将 运行 陷入兼容性问题,反之亦然。