Chapter 22: Schema Evolution and Backward Compatibility
Golden Rules of Proto Evolution
NEVER change a field number
NEVER reuse a deleted field number
NEVER change a field type (int32 → string)
OK to add new fields (old clients ignore them)
OK to remove fields (old clients see default value)
OK to rename fields (wire format uses numbers, not names)
Reserved Fields
messageUser {
reserved3, 7; // these numbers can never be reusedreserved"old_field"; // this name can never be reusedstring name = 1;
string email = 2;
// field 3 was "phone" — removed, reserved forever
}
Backward vs Forward Compatibility
Scenario
What Happens
New client, old server
Server ignores unknown fields (forward compatible)
Old client, new server
Client sees default values for new fields (backward compatible)