兼容性思考

关于兼容性思考

Posted by kris.zhang on 2019-12-04

在发布过程中,经常会遇到兼容性问题。我认为此类问题可以抽象成数据(协议)+代码两个维度。从新、旧上予以分析,可产生如下表格:

新代码 旧代码
新数据 a b
旧数据 c d

代码和数据均没有变更,则是d,此种情况不存在兼容性问题。

代码没有变更,但是数据有变更,则是b,d。比如你上游定义了新的接口入参(或返回值或新增枚举等),你只升级了接口jar包,但是你的代码并没有变更。如果上游发布之后,你的系统发布,则你相同的旧代码可能会使用不同的数据。

代码有变更,但是数据没有变更,则是c,d。比如,你修改了rpc实现端代码逻辑,但是数据和协议均没有变化,你发布到一半,有可能新代码调用老代码,老代码调用新代码。

代码和数据均有变更,则是a情况,此种情况是最为复杂的,比如你的代码发生了变更,前端的代码也发生了变更,你们之前的数据协议格式变化)。则有可能:1,前端新包 vs 后端新代码;2,前端新包 vs 后端旧代码;3,前端旧包 vs 后端新包;4,前端旧包 vs 后端旧代码。

无论如何变化,兼容性场景是可穷举的,唯一可靠的测试办法就是回归所有可能的场景,发现兼容性为题。