新功能要上线,老功能该如何下线呢,下面列举一些具体方案的对比说明:
一、从兼容性上考虑:
方案名称 | 说明 | 优点 | 缺点 |
新接口完全兼容老接口 | 1、最好的办法,客户端无需做处理 2、需要服务端在接口数据结构设计上,要考虑到扩展性的需求,对服务端接口设计要求比较高 | 1、可以下线老的接口 2、数据能够最大程度和新版保持一致 | 无 |
新接口适配老接口 | 1、也是比较好的方法,客户端无需做处理 2、服务端会增加一部分工作量 | 1、可以下线老的接口 2、能够保证数据正确,但不保证新功能被支持 | 1、需要对输出的数据结构进行转换 |
新接口无法适配老接口 | 如果老的接口不能下线,后期维护成本大 | 无 | 1、维护多套老接口,成本非常大,没有优点可言,可见接口设计是很重要的 |
二、从下线角度考虑:
方案名称 | 说明 | 优点 | 缺点 |
按比例切换老接口 | 如,根据userId取模,老接口以一定的百分比逐步下线 | ||
按比例随机返回错误提示 | 如,访问老功能,随机出现错误提示’该接口已下线‘等等。 | 1、不让某个用户一直失败,但又通过一定比例通知到用户该接口即将废弃。 | 1、用户也可能会认为是系统问题 |
在一定时间段,按比例随机返回错误提示 | 某一个时间段内,执行方案2 | 1、尽量降低方案2的负面影响 |
附加相关代码:
1、按比例切换
//默认会切换20%的用户
long userId = getBuyerId();
int mod = (int)userId%100+1;
int rate = Integer.parseInt(getConfigRateValue(20));//默认20%
if(mod<=rate){
return false;
}
return true;
2、在一定时间段,随机给出错误提示
int hour = calendar.get(Calendar.HOUR_OF_DAY);
//2.check if 'hour' is in this period
String period = getConfigHourPeriod()//12-18
String[] hourPeriod = period.split("-");
int start = Integer.parseInt(hourPeriod[0]);
int end = Integer.parseInt(hourPeriod[1]);
if(hour >=start && hour<=end){
//3.fail rates
String failRate = getConfigFailRate()//20
int random = (int)(Math.random()*100)+1;
//4.rate=20%
if(random<=Integer.parseInt(failRate)){
return true;
}
}
return false;