1.1 产品介绍
实时发布服务(Mobile Delivery Service,MDS)是 mPaaS 平台的核心基础服务组件之一,提供版本升级包、热修复包、H5 离线包的管理和发布服务,同时支持开关配置、白名单、发布规则管理功能。在客户端集成实时发布服务功能后,用户可以在 mPaaS 插件中生成新的包,然后在实时发布控制台发布新包,客户端收到新包并进行升级。实时发布服务还支持通过白名单进行灰度发布,可以使用高级过滤规则,比如指定机型,来进行更精准的灰度发布。
1.1.1 功能简述
如图1-1所示,目前移动发布服务支持以下功能:
1. 多种资源类型
1)App的发布包
2)H5离线包
3)热修复包
2. 多种任务类型
1)正式发布
2)灰度发布
3)回滚(目前支持热修复)
3. 多种灰度模型
1)白名单
2)时间窗口
4. 多种过滤条件
1)城市
2)机型
3)OS版本
4)网络
(5)App版本
图1‑1 MDS产品功能图
1.1.2 功能特点
移动发布服务具备以下功能特点:
1.灰度发布
在正式发布之前,可以通过白名单来做小规模发布(比如内部员工)以验证新包的功能是否达到预期。还可以进行时间窗灰度发布,在规定的时间段内发布给规定用户人数。如果达到预期就可以进行全网推送。
2.高级过滤
在进行灰度发布的时候还可以利用高级规则来定义更为精准的白名单人群,比如可以只发给小米手机的用户,多个过滤规则可以叠加,只有在所有的过滤规则都符合的情况下才会推送。
3.实时回滚
在热修复场景下,即使进行了灰度发布,正式上线的时候还是难免会发生问题,这个时候就可以进行实时回滚,自动回滚到发布前的版本。目前仅支持热修复场景。
4.安全验签
为了保障安全性,热修复有自定义的验签流程,保证脚本来源的正确性。mPaaS 插件中提供生成热修复资源包并对包进行加签的功能。
1.1.3 价值优势
移动发布服务的优势有以下几点:
1.支持多产品、多任务、多维度发布管理
多APP支持,同时支持正式升级、热修复及 H5 离线包以及实时在线推送。
2.智能灰度能力,多种升级策略
内部灰度、外部灰度、人群地域、机型网络等多种规则可供选择。
3. 增量离线包更新能力
减少数据冗余及设备带宽占用,在移动端网络条件不稳定场景下可体现优势。
4.高灵敏度、高可用性
基于升级客户端的RPC接口能力,提供高可用的触达能力。
1.2 产品架构
如图1-2所示,MDS主要由两个应用组成,分别是mdsweb和mcube。它们分别负责不同的功能,mdsweb用来提供数据下载通道,mcube提供核心的灰度规则和业务服务。以版本更新链路为例,主要涉及以下链路。
图1‑2 MDS产品架构图
1.RPC请求链路
在手机App发起一个RPC请求(比如:App版本更新请求),首先请求会先经过负载均衡到达mPaaSgw网关应用,mPaaSgw通过查询注册中心ZK上mcube发布的服务(这里以发布版本更新服务为例),mPaaSgw进而将请求转发到mcube(mcube会根据当前RPC请求header等信息,判别当前请求是否在灰度or白名单内),mcube会查询数据库,检查数据库信息是否有更新的版本,如果有则返回对应更新包的相关信息。
2.资源下载链路
客户端在拿到RPC请求返回后,获取到了更新包相关的信息(例如:版本号、下载地址等),客户端根据更新包的下载地址,解析并请求到mdsweb的外网地址,mdsweb收到下载的请求会先检查自己本地的缓存里是否有请求所的更新包,如果有的话就直接返回给客户端,如果没有的话,则会到对象存储中,获取对应更新包并返回给客户端,同时mdsweb本地也会将此更新包进行缓存。
由于MDS这块主要都是文件的下载,特别是全量请求的时候,App请求并发量很高,如果全部都打在后端mdsweb可能会把mdsweb打挂掉或者把行方带宽打满,通常都会在mdsweb前面加一个CDN用于降低mdsweb的并发压力,避免其被打挂掉的可能。
在添加CDN后,下载更新包的请求会先请求到CDN,CDN会先检测自己本地缓存是否有对应的更新包,如CDN发现本地缓存中没有对应的更新包,此时会回源到mdsweb 拉取对应的更新包,同时CDN也将该更新包缓存到本地,这样下次同样请求该更新包,CDN就直接把更新包的返回给客户端。
3.管控链路
用户在mAppCenter(也就是mPaaS移动开发平台)做一次版本发布,上传一个更新包的,mAppCenter会将更新包和相关信息,经nginx路由转发到mcube,mcube拿到此更新包和相关信息后,先把更新包存储到对象存储中,同时把更新包的相关信息和在对象存储中的OSS存储地址,一并存储到数据库中。当用户在mAppCenter控制台设置一些灰度发布策略,白名单之类的信息,这些信息会存在缓存中及时生效。
1.2.1 服务依赖
MDS在运行过程中自身也依赖一些其他组件,比如数据库、缓存、动态配置、对象存储等,各依赖介绍如下:
1. 启动依赖
MDS启动时,会请求mAppCenter拉取元数据,与数据库中的数据做对比,将差异量入库(RDS/OB)。数据库挂掉会影响MDS提供服务。
2. 运行时依赖
运行时依赖以下部分:
(1)mAppCenter会聚合MDS的前端页面,前端界面上的请求会经由mAppCenter nginx路由到MDS
(2)所有离线资源都会最终落到HDFS/AFS/OSS上
(3)灰度发布依赖缓存(Tbase、Hbase等)
(4)所有客户端流量都经由MGS对外提供,升级、热修复、离线包及开关功能都走RPC
(5)客户端走RPC获取到静态资源时,如果配置了CDN会先经由CDN,如果CDN查找不到则回源到MDSWEB
(6)DRM/ZK提供动态配置能力,比如MDSWEB(或者CDN)的内外网地址均由动态配置推送
1.3 网络架构
如图4-3所示,App的请求经过DNS域名解析服务器,经过F5证书卸载到达外网spanner,由HTTP/80到mpaasgw,通过DUBBO/TR协议到mcube。mcube根据TBase 缓存信息查询灰度策略,之后到数据库OB中查询对应信息,并返回给客户端App 请求。另外这里提供的spanner一般不具备证书卸载的功能,所以通常情况,证书卸载放在dmz F5上实现,到达dmz spanner已经是http请求。
App拿到资源下载地址后,走资源请求链路。同样经过DNS->CDN->F5->outer-spanner->mdsweb->HDFS/AFS。如果客户配置了CDN,客户端首先从CDN获取,CDN发现无此资源时,回源到mdsweb,mdsweb先从本机缓存查询,如果没有,则访问HDFS,返回并缓存。
图1‑3 MDS网络架构图
1.4 产品特点
(1)MDS有三个资源请求路径,分别如下:
①资源更新,手机端通过RPC请求访问由MGS暴露的MDS服务,检查是否有资源更新。
②资源上传,各种资源包的上传,都通过mAppcenter路由到mcube,并最终存入对象存储中。
③资源下载,所有资源包的下载路径都由mdsweb暴露,下载路径会在上传时由mcube生成。
(2)MDS的管控聚合在mAppcenter控制台上,页面上的请求都会经mAppcenter里的nginx路由。
(3)当有配置变更时,直接先写入数据库,然后定时刷新到内存中。
(4)灰度发布时的白名单等信息会从缓存中读取。
1.5 常用日志
如图1-4所示,包含了MDS常用的运维日志目录,可用于日常运维问题排查使用。
图1‑4 MDS常用日志介绍
其中经常使用的日志说明如下。
1. 报错日志
1)日志路径
/home/admin/logs/mcube/common-error.log
2)所属应用
mpaas-mcube。
3)说明
错误日志。每一行日志都是错误信息,直接查看即可。
4)查询方式
使用 cat common-error.log | grep xxxx 命令搜索关键字(“xxxx”为关键字)。或者使用 less common-error.log 进入文件,之后按照关键字查找定位异常信息。
5)日志格式
[时间戳] [requestUri] ERROR [className] [keyword]
6)格式说明
如表4-1所示,为报错日志格式表。
表4‑1 报错日志格式表
描述 |
|
时间戳 |
日志输出时间 |
requestUri |
请求的路径 |
className |
异常类名 |
keyword |
代码中抛异常时打印的日志信息 |
2. 升级日志
1)日志路径
/home/admin/logs/mcube/mcube-upgrade-data.log
2)所属应用
mpaas-mcube。
3)说明
升级包RPC信息日志。记录基础升级包的每一次RPC请求上下文,用于排查灰度命中情况。
4)日志查询方式
使用 cat mcube-upgrade-data.log | grep xxxx 命令搜索关键字(“xxxx”为关键字)。或者使用 less mcube-upgrade-data.log 进入文件,之后按照关键字查找。
5)日志格式
[时间戳] [/// - ] INFO MCUBE-UPGRADE-LOGDATA - [null,563]upgrade,[productId],[productVersion],[osVersion],[clientIp],[utdid],[channel],[netType],[city],[mobileModel],[mobileBrand],[clientPosition],[prisonBreak],[resultStatus],[upgradeVersion],[newVersion],[apiVersion],[existingVersion],[fullMD5],[downloadUrl],[userId],[secene],[silentType]
6)格式说明
如表4-2所示,为升级日志格式表。
表4‑2 升级日志格式表
名称 |
描述 |
时间戳 |
日志输出时间 |
[/// - ] |
请求路径。但RPC请求没有路径,因此为空。 |
productId |
Appid + workspaceid + 手机系统类型 |
productVersion |
客户端当前版本号 |
osVersion |
操作系统版本号 |
clientIp |
客户端ip |
utdid |
设备id |
channel |
渠道来源 |
netType |
网络类型 |
city |
城市 |
mobileModel |
手机型号 |
mobileBrand |
手机品牌 |
clientPosition |
客户端位置 |
prisonBreak |
越狱标志 |
resultStatus |
Rpc结果状态码 |
upgradeVersion |
全量版本号版本 |
newVersion |
最新版本号 |
apiVersion |
对应的服务线上版本号 |
existingVersion |
是否存在这个版本的标识 |
fullMD5 |
升级包md5 |
downloadUrl |
下载地址 |
userId |
用户id |
secene |
场景 |
silentType |
提醒方式 |