重命名 Thrift IDL 中的字段是否安全?

Is safe to rename a field in Thrift IDL?

如果客户端不再使用字段,通过重命名弃用 Thrift 中的字段是否安全?我的理解是,只要我们不更改类型,这就应该有效。例如

来自

struct FooResponse {
  1: optional i32 foo
}

struct FooResponse {
  1: optional i32 fooDeprecated
}

是的,它是 100% 安全的。 Thrift 仅在内部处理字段 ID。结构的名称以及方法参数名称仅用于在生成的代码中生成字段名称。他们甚至不通过电线。

此外,这是弃用字段的推荐方法。即使在一个字段完全退役的情况下,也应该将其注释掉,但将其保留在 IDL 中,以防止数字字段 ID 被意外重用。

名称唯一用作名称的地方是服务方法调用。方法没有数字标识符,在这种情况下使用名称。更改名称实际上声明了一个新方法。

TL;DR

从技术角度来看

  • Thrift IDL 中的所有名称都可以根据需要更改,除了...
  • 方法名称不能更改(除非您知道自己在做什么)

关于代码级别的兼容性,如果您避免过于频繁地更改字段名称,API 的任何消费者都会高度重视它。

另见

关于该主题的好读物是 Diwaker Gupta's "Missing Guide"。它还详细说明了 optionalrequired 的优缺点,这在您退出字段之前也应该考虑 - 否则您可能最终会破坏 IDL 兼容性。