系统兼容性设计
2019年某电商平台App发布新版本后,大量用户反映无法登录。
技术团队排查后发现:新版本API修改了用户登录的返回格式,添加了一个新字段。但老版本App没有解析这个字段,导致解析失败。
更严重的是:服务端没有做版本兼容,所有老版本用户都无法登录。
这次故障持续了3小时,影响了约50万用户无法登录。
【面试官手记】
接口兼容性是微服务架构中最重要的问题之一。我面试过的候选人里,能说清楚"接口兼容性原则"的不超过30%,能说出"版本管理策略"的不超过20%。兼容性的关键是接口契约不变。
一、接口兼容性的四大原则 🔴
1.1 四大原则
1.2 常见破坏兼容的场景
1.3 面试追问
面试官:接口不兼容了怎么办?
候选人:两个方向:
一是保留旧接口,同时提供新接口。
二是做版本管理,新版本接口走新逻辑,老版本保持兼容。
面试官:怎么设计兼容性更好的接口?
候选人:四个原则:
一是扩展优于修改,只新增字段不删除。
二是枚举只增不减。
三是字段类型尽量用String兼容。
四是用可选参数代替必填参数。
二、版本管理策略 🔴
2.1 URL版本
2.2 Header版本
2.3 代码实现
三、参数演进策略 🟡
3.1 新增参数
3.2 修改参数
3.3 枚举演进
四、响应兼容策略 🟡
4.1 扩展字段
4.2 响应字段修改
4.3 JSON Schema兼容
五、数据库兼容性 🟡
5.1 字段兼容性
5.2 版本化Schema
六、生产避坑 🟡
6.1 兼容性设计的五大坑
坑1:接口契约不明确
坑2:枚举值删除
坑3:字段类型修改
坑4:必填参数变更
坑5:没有灰度发布
6.2 兼容性检查清单
七、真实面试回放 🟡
面试官:接口要新增一个字段,旧客户端不升级怎么办?
候选人(小张):三个原则:
一是新增字段不能是必填。旧客户端不传,服务端要能处理。
二是新增字段要有默认值。比如新字段叫nickname,旧客户端不传,服务端默认空字符串。
三是枚举新增不能删除。旧客户端遇到不认识的枚举值要能忽略。
面试官:如果旧接口的字段要改名呢?
小张:两个步骤:
一是新旧字段共存一段时间。比如name改nickname,保留name,新增nickname。
二是两个字段都支持。比如查询时两个字段都有效,写入时写入nickname。
面试官:接口要删除一个字段,但有老客户端还在用怎么办?
小张:不能直接删除。要分三步走:
一是在代码层面忽略这个字段,不返回它。
二是等待所有客户端升级。
三是确认没有客户端依赖后再删除。
【面试官手记】
小张这场面试的亮点:
知道新增字段的兼容性处理
知道字段改名的平滑迁移方法
知道删除字段的正确步骤
接口兼容性是P6工程师必备技能,能完整回答的候选人,说明有实际项目经验。
接口兼容性的核心是扩展优于修改。记住三个要点:
- 字段兼容:只增不减,有默认值
- 枚举兼容:只增不减,忽略未知值
- 版本管理:保留旧接口,新接口做兼容
接口契约一旦发布,就要保持兼容。