一、概念
开关系统: 可以控制某一功能的上下线
二、背景
rn建设正在稳步推进中
rn页面的兜底,降级逻辑,有待完善, 确保终端页面的高可用
如何实现rn页面内的兜底、降级
三、目标收益
提供紧急逃生能力,确保终端页面的高可用
为精细化运营提供基础能力:支持不同的用户群体做不同的运营策略
结合埋点系统,支持AB实验
四、使用场景
-
AB实验
结合埋点系统,切分一部分用户使用新功能A方案,一部分用户功能B方案,对比A或者B哪个指标更好
-
功能入口的显隐
- 比如低版本用户、或某一区域用户,不显示某一功能入口
-
精细化运营
-
可以根据不同指标的用户,匹配不同的跳转逻辑。
比如羊毛党,提供福利页面跳转
高价值用户,提供高利润产品的跳转
-
-
体验优化
- 比如性能低的手机,页面使用h5呈现,其他手机使用RN呈现
-
稳定性保障
紧急避险。比如某一页面由H5改版为RN。上线以后有重大bug,修复耗时较长,可以将该入口立即切换为旧的h5页面。必现线上出现重大影响
灰度放量。
五、方案内容
5.1、描述
所谓的开关,即是一份配置表。
可以针对不同的手机、不同的系统、不同的版本、不同的app、不同的参数,分别给出对应的配置,由于可以实时控制该配置信息的上下线,以及实时修改配置,命名为开关系统。
5.2、开关类型
终端开关:给h5、Android、iOS、react-native使用的开关
服务端开关: 给后端使用的开关
5.3、构成
方案包括四部分:
admin管理后台: 用来管理开关的增、删、改、查、上下线
数据管理服务:存储数据、提供相关操作数据的接口
终端SDK: 用于获取开关配置信息
后端服务SDK: 用户获取开关配置信息
5.3.1、管理后台
- 配置页面
- 配置逻辑
5.3.2、后端服务
提供api
存储数据
支持测试环境和生产环境
5.3.3、终端SDK
// 根据客户端公参,获取开关信息
getSwitchInfo(switchId: string, params:object) {
return switchInfo
}
-
客户端SDK:提供api,方便客户端开发调用
- 获取某一开关的配置信息:id和公参
5.3.4、服务端SDK
// 根据服务端参数,获取开关信息
getSwitchInfo(switchId: string, params:object) {
return switchInfo
}
// 根据客户端信息获取开关信息,给客户端使用,一般用于转发客户端的请求
getSwitchInfoForFrontEnd(switchId: string, params:object) {
return switchInfo
}
-
后端SDK:提供api,方便后端开发调用
- 获取某一接口的个性化配置信息:id,公参
5.3、公参
-
终端
客户端:OS、appVersion、OSVersion、userId、deviceId、ip、。。。
前端:浏览器名称、浏览器版本、userId、deviceId、ip、。。。
-
后端
可转发客户端请求,要求客户端提供相关的公参
【待定】由后端开发指定
5.4、开关配置
5.4.1、分支配置
用来配置当前开关,允许返回几种值。可以类比为枚举值的概念。分支配置,就是用来配置这个枚举。
分支配置是后续配置的基础
支持增删改查
5.4.2、白名单配置、黑名单配置
用于指定某个用户,必定命中/不命中某个分支
一般用于测试场景,需要逐个让测试账号命中每一个分支,测试不同分支的行为
支持用户ID和设备ID,不允许多选,默认用户ID
支持多个id的配置
5.4.3、通用规则配置
用来配置用户的分配规则。
例如:
-
规则1:
app版本在2.3.0以上
操作系统为Android
-
规则2:
操作系统为iOS
地理区域为河北
-
规则3:
- 不符合上述规则1/2的用户
5.4.4、规则和分支匹配关系
用于指定不同的规则对应的分支
5.4.5、灰度设置
用来控制不同分支的灰度值,支持0%-100%
发布
可以一键上线到测试环境
上线过测试环境的开关,可以一键上线到生产环境,避免需要到生产环境重新创建