重命名 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"。它还详细说明了 optional
和 required
的优缺点,这在您退出字段之前也应该考虑 - 否则您可能最终会破坏 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"。它还详细说明了 optional
和 required
的优缺点,这在您退出字段之前也应该考虑 - 否则您可能最终会破坏 IDL 兼容性。