乐趣区

关于android:Switchquery移动端秒级配置触达平台

作者:京东批发 胡本奎

一 背景

随着挪动互联网的疾速倒退,为满足各类用户及人群的体验需要,挪动端的开发者们开发了丰富多彩的体验与性能。同时对于疾速管制各类性能的切换、灰度,降级等能力的要求也越来越高,例如通过配置疾速关上某个灰度性能,通过配置信息的实时触达敞开某个引起 App 解体的性能等等。因而须要一套具备实时触达配置信息到挪动端的能力,消沉本的配置平台来解决。咱们研发了 Switchquery 配置平台,它是一套具备秒级变更能力,助力业务疾速变更,让配置信息在 App 运行中秒级失效,同时晋升配置信息触达率,对立治理的配置平台。

二 技术原理

1 触达技术选型

在 Switchquery 配置平台外围能力中,实时触达的能力尤为重要,目前业界支流的触达技术计划次要有以下几种形式:

1) 推送 push 音讯: push 音讯以后曾经成为实时推送营销信息、重要告诉的最次要伎俩之一,push 音讯领有较强的实时性,而理论的挪动端的利用场景中,push 音讯多用于营销计划或重要信息的告诉,很少应用此通道来作为研发配置信息的触达通道,其会产生 UI 交互的变动。另外 push 音讯依赖于用户关上告诉权限开关,而业内广泛关上告诉开关权限的比例低于 50%,因而大部分用户无奈触达。

2) tcp 或 websocket 长连贯: 通过建设一条客户端到服务端之间的长连贯通道,此计划能够在产生配置信息变更后实时的将信息传递至客户端,然而须要消耗较大的服务器资源,来保护一条长连贯通道。

3)轮询: 客户端以肯定的工夫距离向服务端发出请求,通过频繁申请的形式来放弃客户端和服务器端的信息同步,这种同步计划的最大问题是当客户端以固定频率向服务器发动申请的时候,服务器端的数据可能并没有更新,这样会带来很多有效的网络传输。

2 实现原理

2.1 实时触达计划

因为推送 push 音讯计划存在触达比例低的问题,长链接存在消耗服务器资源的毛病,同时轮询的计划也存在很多有效的网络传输等弊病,因而以上三种计划都不是 Switchquery 配置平台的触达计划的最佳技术选型。通过调研,咱们采取了一种配置信息从服务端实时触达到客户端的新计划,计划的具体形容为:先搭建一个信息配置管理 CMS 平台,同时构建一个客户端获取配置信息的客户端组件,由用户在 CMS 配置信息,而后由 CMS 后盾将配置信息的版本号信息同步至对立网关,所有客户端申请达到对立网关,并在返回的接口数据的 header 内都会携带最新的版本号至客户端,客户端比照发现新的版本号比缓存的版本大则申请配置信息拉取 Switchquery 配置接口,这样只有 App 关上就会存在接口携带变动标记返回,这样就会触发客户端被动发动申请更新配置信息,进步了实时性,不受 push 开关权限管制和影响,不须要额定打造长连贯通道,具备低成本,实时性低等长处。以下是 Switchquery 配置平台的时序图:





1) 用户在 Switchquery CMS 后盾配置相干信息,目前平台上反对配置布尔类型、整型、字符串等类型的配置信息,能够配置 App 版本失效区间,按设施号灰度比例,iOS 或者安卓平台的设定,失效白名单等相干信息。

2) Switchquery CMS 后盾配置信息并提交和保留实现后,由 CMS 配置后盾将新的版本号写入到对立网关后盾(所有客户端到服务端的 http 申请都会通过对立网关,所有服务端返回到客户的 http 申请响应都会通过对立网关),对立网关记录下数据版本号,客户端的所有接口申请的响应 header 减少一个字段 x -switch-config,此字段会携带回配置信息的版本号至客户端。

3) Switchquery CMS 配置后盾实现信息配置后,后盾会基于以后工夫戳,生成一个新的配置信息版本号,同时将这些配置的静态数据写入到服务端内存缓存内,同步刷新配置开关接口。

4) Switchquery CMS 配置后盾将配置信息数据写入和保留一份静态数据 json 到 CDN,避免接口降级或者失败当前能够降级从 CDN 拉取配置信息数据。

5)网关会将版本号下发至客户端网络组件,网络组件在承受到网络申请返回后,首先会解析网络申请的响应 header,如果解析到关键字将其对应的 value 一起解析封装后发动一个全局告诉。

6)配置客户端组件在监听到告诉后,与本地曾经缓存的配置信息数据版本号进行比对,雷同则不解决,大于本地版本号则发动配置信息拉取申请,这样即可获取到最新的开关配置信息并缓存在磁盘。

7) 客户端在接口降级或者失败后会从 CDN 拉取配置数据信息。

此种触达形式只有客户端关上即会触发申请至对立网关,随即就能够依据变动状况来决定是否更新最新的配置接口数据,无需 push 告诉,无需建设长连贯通道,成本低,实时性高。

2.2 流程架构设计





1)用户在 CMS 配置平台进行信息配置后,配置后盾接口对配置信息进行比照,包含配置信息中的开关的状态,开关值等要害信息,如果没发生变化,则完结;发生变化则判断此次变更间隔上一次变更是否到了 n 秒,间隔 n 秒内则不会触发配置信息变更同步,间隔 n 秒外则触发配置信息同步,触发网关和后盾接口数据发生变化。

2)CMS 触发变动将新的版本号传递至对立网关,对立网关会做数据版本号的存储,同时会将对立网关的所有机器内存里都存储一份最新的版本号。也会将数据变更信息同步到配置后盾接口,同步写入一份 json 静态数据到 CDN,这个是为了避免配置信息接口服务端挂了后能够走 CDN 兜底。

3)客户端任意接口申请都会通过对立网关,所有申请的返回也会通过对立网关返回,在返回的响应 header 内新增一个 x -switch-config 字段,其 value 是一段字符串,由下划线隔开,格局如:switch_version_randomtime_reserved, 第一个字段 switch=0/1,其中 0 示意此能力对立降级敞开,1 示意此能力关上;第二个字段 version 就是配置信息的数据版本号,目前是按工夫戳的模式标识版本号;第三个字段 randomtime 示意客户端获取到版本号变动差别后并非立即申请,会提早 [0,randomtime] 之间的一个随机工夫后才发动申请,这个是为了升高霎时尖峰流量的产生;第四个字段是留作将来应用。

4)客户端网络框架在客户端会不间断随机播送全局告诉,开关客户端组件收到告诉后,获取到对立网关的返回数据,解析网络接口返回的 header 局部,获取 x -switch-config 字段,解析字段中的 value,如果是降级,则完结,如果版本号没有发生变化, 则完结,如果非限流同时 switch=1,并且本地的缓存的开关 version 小于解析后的 version,则依据 randomtime 随机数发动客户端申请;如果服务端返回了特定的限流码则客户端间接从 CDN 拉取配置信息数据并更新本地缓存数据,如果服务端失常返回则获取开关数据并更新本地缓存。

3 技术优化

在 Switchquery 配置平台的设计开发中,从实时性,性能,老本,持重等多维度进行了优化,具体的优化措施如下:

1) 思考到实时性与机器老本的均衡,咱们在 CMS 配置端做了聚合 n 秒后才将配置变更同步至对立网关,次要为了避免多个用户在很近的工夫内做了多个批改,会导致对立网关侧频繁的接管到不同的版本号,进而引起客户端频繁的发动申请,导致配置信息服务端的流量陡增,目前的经验值是 n = 5 秒。

2) 思考性能与机器老本的均衡,客户端会依据 randomtime 来随机发动申请,是为了打散申请发动机会,理论教训咱们发现 5s 会增日常 2 倍左右的 QPS,10s 会减少日常 1.5 倍左右,理论各个场景能够依据本身的服务器机器数量与老本来动静决定抉择设置多长时间。

3) 为了保障在大促或者非凡促销场景下的稳定性和健壮性,咱们在配置信息产生后,首先写入数据到服务器的内存里,这样每次客户端的申请就间接读取内存性能很高,另外也会写入一份 json 数据到 CDN,当服务端出问题后或在大促被动降级后能够通过 CDN 来兜底。

4) 实时触达计划在 App 原生端来实现此性能,同时对于 App 内嵌的小程序、H5、RN 都提供了桥接组件,尤其 webview 也能够读取此配置信息来实现配置信息的实时获取。

三 接入流程

1 客户端:

1.1 Android 平台接入

//chName: 开关名称,拉取失败或未取到配置返回 defValue 默认值
SwitchQueryFetcher.getSwitchBooleanValue(String switchName, boolean defValue)
// 获取 int 开关值,拉取失败或未拉取到配置返回 defValue 默认值
SwitchQueryFetcher.getSwitchIntValue(String switchName, int defValue)
// 获取 String 开关值,拉取失败或未拉取到配置返回 defValue 默认值
SwitchQueryFetcher.getSwitchStringValue(String switchName, String defValue)

1.2 Apple 平台接入

// 自定义 bool 开关,获取不到返回 NO
BOOL JDSwitchBoolValue(NSString *key); 
// 自定义整型开关,获取不到返回 0
NSInteger JDSwitchIntValue(NSString *key); 
// 自定义字符开关,获取不到返回 nil
NSString* JDSwitchStringValue(NSString *key); 
// 取 intvalue  
NSNumber *n1 = [JDRouter openURL:@"router://JDBSHServerConfigModule/intValue?key=test"
                   arg:nil
                 error:nil
            completion:nil]; 
// 取 boolvalue   
NSNumber *n2 = [JDRouter openURL:@"router://JDBSHServerConfigModule/boolValue?key=test"
                arg:nil
                error:nil
        completion:nil];
// 取 stringValue 
NSString *n3 = [JDRouter openURL:@"router://JDBSHServerConfigModule/stringValue?key=test"
                arg:nil
                error:nil
        completion:nil];

2 CMS 创立

为了让研发测试阶段和线上的数据安全隔离,预发和线上的数据是隔离的,在预发环境测试验证 OK 后,配置数据再同步到线上。

2.1 业务模块创立

进入 CMS 界面,抉择左侧的模块治理菜单,进入模块治理界面,新增业务模块,弹出弹窗如下图:





1) 名称:对应业务模块名称;

2) 关键字:设置对应业务模块的关键字;

3) 管理员:模块调配的管理员,个别默认为模块的创建者;

4) 成员:该模块调配的治理成员,成员有新增,删除,批改该模块下的配置权限,但没有批改,删除以后模块的权限;

5) 阐明:对以后模块的形容;

2.2 配置创立

创立好业务模块后,在该业务模块下新建或者编辑配置,编辑界面如下图:





1) 开关编号:为以后开关配置调配的惟一标识编号;

2) 平台版本:目前反对 android,apple,ipad 三种平台,可反对开关失效 App 的版本的区间范畴设置,依照左闭右开的准则,默认不设置,全版本失效;

3) 零碎版本:设置零碎版本的区间,默认不设置,全零碎版本失效;

4) 开关类型:目前反对布尔开关,整形开关,字符串开关以及敏感数据开关(10.4.4 版本以上)4 种类型开关配置信息;

5) 开关名称:设置的开关配置名称;

6) 开关关上比例:命中规定为:android 平台依据 uuid,apple 平台依据 openudid,通过 hash 算法算进去的值和 100 取余加 1,如果最终值小于或者等于设置的值即为命中,反之不命中;

7) 白名单:该开关配置对应的白名单,能够通过手动的形式将 pin 以逗号分隔拷贝到编辑框,将来可接入尝鲜零碎通过扫码的形式增加白名单;

8) 开关配置值:布尔开关默认不展现,整形或者字符串类型的配置类型需设置开关值;

9) 开关形容:通过形容晓得开关配置的用处;

四 收益

1 护航 X 我的项目

在 2022 年春晚 X 我的项目中每次口播的时候面临着流量大,启动接口多的问题,这样会造成网关压力微小,业务瘫痪的问题,会导致整个 X 我的项目的失败,不容有失。因而通过销峰降频,缩小接口申请等形式进行 App 启动降级。通过 Switchquery 配置平台,在客户端下发降级信息配置,以及修改工夫戳等数据,胜利的保障 X 我的项目中 App 启动接口的胜利降级。

1.1 启动接口降级





降级成功率为 100%,线上 0 事变,启动接口数从 110 个降级到 8 个。

1.2 流量降级

单个接口的峰值 QPS 比日常 QPS 降幅达 88.7% 左右, 网关整体峰值 QPS 比日常 QPS 降幅达 30% 左右,均在 2 分钟之内实现降级。

2 护航双十一

2022 年双十一期间 Switchquery 保障了大促流动的稳固经营,具体情况如下:





2022 年双十一期间,Switchquery 配置平台服务业务模块数为 38 个,在线开关总数为 392 个,整体开关配置的触达率为 98.3% 左右, 服务开关配置秒级变更次数为 61 次,Switchquery 配置接口峰值 QPS 环比去年降落 58.8% 无效的保障了大促流动的顺利进行。

五 结语

将来 Switchquery 配置平台会为更多的业务模块提供配置服务,同时咱们会赋能更多的 App,反对一整套从配置客户端组件管制到后盾 CMS 反对多 App 切换以及网关实时秒级触达的一整套秒级触达的高性能挪动配置技术计划。同时反对更齐备的性能体验例如操作日志查看能力,反对机型过滤能力,黑白名单通过接入尝鲜平台通过扫码的形式动静增加等性能,打造一套具备秒级配置变更能力,助力业务疾速变更的配置平台。

退出移动版