PHIL / NOTES
← 返回笔记目录
gRPC

Protobuf 演进:字段号比字段名更重要

在新旧服务并行时保护二进制兼容性。

原理

Protobuf 二进制消息按字段号识别字段。新增字段应分配新号码,删除字段后应把旧号码和名称保留,避免后续消息被按新含义解释。

开发中的做法

字段名修改可能影响 JSON 映射和源代码调用。类型修改要分别检查线格式、业务语义和生成代码,不能只凭能否编译来判断兼容。

验证与追问

测试旧客户端读新服务响应和新客户端读旧服务响应。涉及默认值时,也要验证应用能分辨缺字段和显式设置的值。

代码片段

message Item {
  reserved 2;
  reserved "legacy_name";
  string id = 1;
  optional string title = 3;
}