阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

苏宁金融 App 全链路灰度实践

  • 2018-08-13
  • 本文字数:4380 字

    阅读完需:约 14 分钟

背景

在这个移动互联网日渐成熟的今天,手机端流量占比高达 85%。大家为了抢夺用户手机屏幕上的一席之地,杀成红海,产品的极限飙车、急速迭代。整个系统的日趋复杂可是研发时间一再压缩,变成了移动产品质量的达摩克利斯之剑。

对于 Native App 来讲,这个问题将变得异常严重,任何一个线上的质量问题修复的成本非常高昂,甚至还要依赖外力来解决。

在这样的环境下,移动端版本灰度发布的价值突显而出:为待发布的移动端版本提供快捷和可控范围的生产环境验证,以确认版本质量是否符合用户和业务的要求。

打造快捷和可控的生产验证,对于移动端来讲需要一个完整的灰度解决方案。相比其他移动端的灰度方案,苏宁金融的方案既包括移动 APP 环节的灰度,也包括移动网关到整个 APP 后端服务环节的灰度,实现了在真实生产环境下,苏宁金融 APP 全链路的灰度,如下图:

图 1 苏宁金融 APP 全链路灰度

接下来我们将分两部分详细阐述: APP 网关以及 APP 后端服务灰度和 APP 灰度系统。

1.APP 网关以及 APP 后端服务灰度

随着移动端用户数量的增长,移动后端服务发布出现的事故影响面越来越大,往往可能一个测试没覆盖的低级错误造成大面积线上用户不可使用的故障。

在不断的填坑中,我们发现移动服务端发布存在以下三大问题:

  • 影响范围不可控。一旦发布到生产,特别是一些特别重要的服务的发布,如登录、首页、个人中心等。这些服务一旦出问题,会导致所有用户的崩溃。
  • 发布后验证的时间节点。为了保证上线后第一时间进行生产验证,我们一般在系统调用较少的时候进行发布(半夜)。开发人员的电话需要 24 小时待机应对生产验证问题,这对开发人员是一个较大的考验。
  • 问题反馈不易,出现生产问题后,只能通过被动的投诉来发现问题,开发人员疲于奔命,产品还要遭到差评。

我们的思路

如何做到生产安全发布呢?我们需要解决以下几个问题:

  1. 减小影响范围:发布后尽量不会影响到正常用户使用,将线上问题的影响范围可控。
  2. 支持生产环境验证:支持指定人员在指定时间范围内生产环境验证,并支持少量外部用户测试。
  3. 实时数据分析:实时采集上线后的日志与并进行异常分析告警。

移动网关以及后端服务灰度方案

我们在接入网关提供一个独立、安全、可追溯的线上灰度发布环境,实现在客户端和业务层不需要改变的情况下,让业务层服务具备灰度的能力。

在接入网关路由层,我们采用 Nginx+Lua 比较成熟的方案,能按照灰度配置进行流量路由;持久化 Redis 缓存灰度信息配置,并把相关配置推送到 Nginx 代理以及下游网关服务器;网关服务与业务服务采用自研 RSF 微服务调用框架通讯;管理后台负责灰度及路由策略配置。

先来看一下我们的流程图:

图二 移动端网关灰度流程图

  1. 用户请求流量到达 Nginx 代理,请求里面包含了设备信息、版本信息、终端信息、用户信息。
  2. Nginx Lua Worker 根据 Redis 推送过来的灰度配置,计算当前请求是否在灰度配置名单中,如果在灰度名单中,则路由到灰度聚合网关集群,否则,路由到正常的聚合网关服务器集群。
  3. 移动后端服务发现:聚合网关与下游后端服务之间采用自研 RSF 服务协议,苏宁 RSF 微服务调用框架支持 1000+ 系统,每天服务调用次数达到 200 亿。RSF 提供服务节点的自动注册和发现,服务节点的注册和续约通过 Redis 来实现,Pump 订阅所有 Redis 的 key space, 当 key space 发生变化时,Pump 聚合所有 Redis 服务节点数据,将服务提供方节点数据写进 ZK, 消费方通过 ZK 来获取及更新服务方节点列表,从而少量的几台 Redis 就可以处理几十万的服务节点注册和续约。
  4. 移动后端服务灰度路由:我们在消费方服务器 jvm 中添加分组配置,Normal 组和 Gray 组。当消费方服务器启动时,消费方自动将服务器分组信息注册到 RSF 注册中心,RSF 注册中心实时将数据推送到对应的消费方。消费方在发起接口请求时,根据灰度设置计算出路由的规则,从而选择对应的服务器分组。最终:当灰度关闭时,用户请求路由到 Gray+Normal 服务器;灰度开启时,在灰度名单内的访问,用户请求被路由到 Gray 的业务服务器集群、不在灰度名单内的访问,用户请求被路由到 normal 的业务服务器集群。

移动网关以及后端服务支持的灰度规则

  • APP 类型:苏宁金融 APP 客户端版本、苏宁金融融合钱包等
  • 终端类型:手机型号、手机设备号等
  • 用户类型:用户当前地域、IP、以及基于用户行为数据的分析,指定偏好或特定类型的用户,如门店用户、任性贷用户等
  • 按比例随机用户:可以随机按照 5%、10% 等比例的流量

加入灰度功能之后,我们的移动服务发布流程也做了一些改变:

移动网关以及后端服务灰度发布

发布步骤:

  1. 截流:发布之前,进行截流。平常用户的流量被分发到所有 Gray+Normal 服务器集群,当截流开启时,用户流量全部会路由到 Normal 服务器以保证外部用户正常访问,而 Gray 的服务器集群只用于灰度发布。
  2. 灰度发布:通过 CD 平台,对网关 Gray 服务器集群和业务 Gray 服务器集群发布新代码,此时因为截流开启不会有任何外部流量进来,所以灰度发布不会对线上环境正常访问产生任何影响。
  3. 部自测:在灰度发布之后,测试人员通过管理后台配置把测试手机设备配置到灰度名单,配置后,此测试手机的访问将自动路由到灰度服务器集群,从而测试人员可以在生产环境既验证新发布的功能,也可以回归老版本的功能,保证了新发布的功能对于线上客户端版本的兼容。
  4. 外部灰度:内部产品和测试在生产环境上验证没有问题之后,可以通过灰度配置平台配置部分线上流量路由到灰度服务器集群,此配置可以根据客户端的版本号、终端类型等参数选择客户端老版本流量或者新版本流量,从而按照一定范围一定规模进行外部用户的灰度验证。
  5. 正式发布:经过内部验证和外部灰度验证之后,如果都没有问题,通过持续交互平台继续对正常的生产服务器集群进行分批发布。
  6. 完成发布:关闭灰度开关。用户的流量将自动路由到 Gray+Normal 的服务器集群上。
  7. 异常数据:通过日志采集监控,准实时查看到业务请求的成功率。当成功率低于阀值,会有告警发送给对应业务系统服务人,并且支持一键降级。

价值

  • 可控范围:灰度开启后通过网关代理层(Nginx),动态将正常流量引到 Normal 网关上,再通过 RSF 微服务调用流量引导到后端业务灰度服务器上,只有符合条件的可控范围灰度流量能访问到新发布的灰度服务器上,减少发布对正常用户的影响。
  • 线上验证:由于硬件、部署环境以及数据的原因,我们的测试环境与生产环境很难 100% 的一致,通过网关以及后端业务灰度的功能,支持内部人员进行生产验证,杜绝生产环境不一致可能带来的问题。
  • 数据分析:灰度信息自动采集,异常信息自动告警,出现问题一键降级。

2. 移动 APP 灰度系统

移动 APP 由于部署的特殊性,灰度有三不易:

  • 应用安装不易,灰度包无法静默安装,往往需要用户主动点击安装,一旦发现致命 BUG,需要用户自己卸载灰度版本,回退到稳定版,操作成本较大。
  • 应用分发不易,灰度版本每次更新是新功能的集合体,即使是上万个用户使用,真正使用到新功能的用户不多,从而导致新功能没有充分灰度。
  • 用户反馈不易,出了问题,如何反馈成了一大阻碍,崩溃问题尚能后台自动上传,业务问题不遇到较真的用户,比较难收集到反馈。

我们的思路

受到《退出、呼吁与忠诚》一书的启发(书中对如何保持组织内部的忠诚,有精辟的分类分析),我们认为 App 灰度的关键在于把灰度版本推送给已经有一定黏性的忠诚用户手上,给出方便的退出机制和反馈机制,并积极的回应他们的反馈,帮助 App 进入良性的循环。

问题:怎么找到这些用户呢?这就要靠全流程的数据埋点和数据基线。依靠大数据用户行为分析,找到最活跃的用户,更找到那些愿意积极反馈的用户。建立可靠的问题反馈解决机制,维护好 APP 与灰度用户稳定的互信关系。

我们的 App 灰度系统就是一个 App 灰度版本的精准分发和反馈系统,找到灰度版本使用合适的用户并将用户流量导入到新上线的功能,帮我们找到问题,并以最便捷的方式反馈给我们。 

图三 移动 APP 灰度系统架构图

移动 APP 灰度系统方案

持续集成平台负责管理代码分支、代码编译、应用打包、应用加固。

数据集市是用户行为数据,消费数据的数据中心,提供数据分析引擎。

OSS 服务是灰度包对象存储服务,提供私有下载链接,从而防止安卓下载包被应用市场抓包获取,导致流失到外部市场。

接口服务直接面向用户提供灰度下载逻辑功能,部署在高可用高吞吐业务集群,与灰度系统隔离。

图四 移动 APP 灰度发布流程图

灰度系统后台提供灰度用户配置

  1. 灰度后台配置灰度用户名单,我们通过客户端的埋点和数据集市行为建模,为用户构建画像,筛选出目标活跃用户,存储到灰度数据库中,也通过推的形式推送给移动升级配置服务的 Redis 缓存中。
  2. 灰度系统同时管理安卓的打包服务和 IOS 的灰度邀请码服务。对于安卓灰度后台将发起一个打包加固的任务,自动生成灰度版本并上传到 OSS 服务器(对象存储服务器),以供移动升级服务下载使用。对于 IOS,灰度后台将扫描苏宁邮箱系统 (TestFlight 已经提交灰度版本),与用户信息组合在一起,生成 IOS 灰度邀请链接,推送给移动升级服务缓存。
  3. 移动升级服务根据灰度系统推送过来的用户配置分发灰度版本下载链接,在灰度名单中的用户,打开苏宁金融 APP 的时候就会收到内测版本邀请,参与内测版本更新。

苏宁金融 APP 全链路灰度发布

下面是苏宁金融 APP 灰度发布的甘特图:

图五 苏宁金融 APP 灰度发布甘特图

  1. 第一阶段,APP 服务器端灰度发布到服务端正式发布阶段。APP 服务端灰度发布,由于做了截流处理,支持工作时间发布,主要做内部测试和产品人员做生产验证。
  2. 第二阶段,APP 两轮内灰阶段,各产品线开始做 APP 的灰度验证,第一轮内灰反馈的问题修复后,开始扩大灰度范围,推广到所有企业内部员工灰度。
  3. 第三阶段,根据依据移动大数据行为分析,筛选出 APP 外灰名单,给名单内的用户发放灰度版本并收集用户反馈。
  4. 第四阶段,灰度反馈没有问题之后,投放应用市场。

爆款产品不仅仅只是产品本身,而是一种创新的极致的用户问题的解决方案。苏宁金融移动端通过践行全链路灰度,不仅仅保障了用户持续稳定的获得苏宁金融服务体验,也使得整个研发系统运转效率的本质提升,加强了移动 APP 的持续交付能力。后面,我们将优化整个灰度链路,加强数据收集和分析在灰度过程中运用,从数据方面来看灰度。

作者简介

戴治波,苏宁金融研发中心技术总监,负责苏宁金融 APP 以及移动网关技术架构工作,曾任职 Marvell 和 Motorola 资深工程师。

吴晨捷:苏宁金融研发中心 Android 高级技术经理,2013 年加入苏宁金融,一直参与苏宁金融 App 客户端的研发工作,经历了苏宁金融 App 的历次大改版,产品迭代研发。主要负责苏宁金融 Android 客户端的架构工作,现在聚焦于 App 的持续交付,标准流程建设。

感谢覃云对本文的审校。

2018-08-13 18:103603

评论 3 条评论

发布
用户头像
全链路灰度中,如何处理数据库中的配置数据兼容问题的?
2019-09-06 12:21
回复
方哥有好的数据兼容方案么
2020-05-19 10:46
回复
没有更多了
发现更多内容

为何公司的业务都在往小程序化发展

Geek_99967b

小程序

救火不如防火 IoT平台技术构建智慧消防系统筑牢防火墙

AIRIOT

低代码 物联网 低代码,项目开发

不懂就问:“无人驾驶汽车革命”到底进行到哪一步了?

澳鹏Appen

人工智能 自动驾驶 无人驾驶 训练数据 数据训练

软件测试 | 测试开发 | 只需搞定Docker,环境问题再也不是测开路上的『坑』

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | JMeter 典型电商场景(下单/支付)的性能压测

测吧(北京)科技有限公司

测试

嗨,程序员,你知道高级工程师用的搜索引擎吗?

梦想橡皮擦

9月月更

软件测试 | 测试开发 | 持续交付-Jenkinsfile 语法

测吧(北京)科技有限公司

软件测试 | 测试开发 | 电商业务性能测试(二): Jmeter 参数化功能实现注册登录的数据驱动

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | web自动化总卡在文件上传和弹框处理上?

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | 一改测试步骤代码就全写?为什么不试试用 Yaml实现数据驱动?

测吧(北京)科技有限公司

测试

使用 Apifox 自动通关"羊了个羊" 1 万次,牛逼大了

Liam

程序员 自动化测试 抓包

软件测试 | 测试开发 | 大话测试数据(一)

测吧(北京)科技有限公司

测试

小程序与工业互联网能够相辅相成的原因

Geek_99967b

小程序

每日算法刷题Day15-0到n-1中缺失的数字、调整数组顺序、从尾到头打印链表、用两个栈实现队列

timerring

算法题 9月月更

软件测试 | 测试开发 | 大话JMeter4|不同的并发数可以自动化做压测吗?

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 |H5性能分析实战来啦~

测吧(北京)科技有限公司

测试

一加与oppo是什么关系?答案就在这里

Geek_8a195c

哪种企业更需要低代码开发框架

力软低代码开发平台

赞!| 龙蜥及其理事分获“2022 OSCAR 尖峰开源社区及项目、尖峰开源人物”奖项

OpenAnolis小助手

开源 龙蜥社区 获奖 理事长 产业大会

一起瓜分20万奖金!第三届火焰杯软件测试大赛开始公开选拔!

霍格沃兹测试开发学社

低代码对接腾讯云-阿里云短信平台

葡萄城技术团队

低代码

软件测试 | 测试开发 | 同样是断言,为何 Hamcrest 如此优秀?

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | 如何确保API 的稳定性与正确性?你只需要这一招

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | 学习Docker就应该掌握的dockerfile语法与指令

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | Docker+Jmeter+InfluxDB+Grafana 搭建性能监控平台

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | JavaScript脚本注入,完成Selenium 无法做到的那些事

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | 后端Web开发框架(Java)

测吧(北京)科技有限公司

测试

【JavaScript】巩固JS开发中十个常用功能/案例(11-20)

海底烧烤店ai

算法 前端 JavaScrip 9月月更

软件测试 | 测试开发 | 如何做好性能压测(一):压测环境的设计和搭建

测吧(北京)科技有限公司

测试

深入浅出带你走进 RocksDB

KaiwuDB

数据库 RocksDB

4 分钟过一遍 ES12 的 5 个要点~

掘金安东尼

前端 9月月更

苏宁金融App全链路灰度实践_语言 & 开发_戴治波_InfoQ精选文章