10 月 23 - 25 日,QCon 上海站即将召开,现在大会已开始正式报名,可以享受 8 折优惠 了解详情
写点什么

苏宁金融 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:104617

评论 3 条评论

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

知乎基于 Apache Doris 的 DMP 平台架构建设实践|万字长文详解

SelectDB

Apache 数据库 数据仓库 广告系统 Doris

Spring Security用户定义

急需上岸的小谢

7月月更

跟着官方文档学 Python 之:基础语法

甜甜的白桃

Python 数据类型 7月月更

HTTP的前世今生

技术小生

HTTP 7月月更

全面掌控!打造智慧城市建设的"领导驾驶舱"

华为云开发者联盟

云计算 后端 智慧城市 智慧屏

Spring AOP

武师叔

7月月更

漏洞挖掘之文件漏洞后利用姿势【网络安全】

网络安全学海

网络安全 安全 信息安全 渗透测试 漏洞挖掘

React + Node.js 全栈实战教程 - 手把手教你搭建「文件上传」管理后台

蒋川

node.js react.js mongodb Express axios

影响分析:RubyGems未授权访问漏洞(CVE-2022-29176)

龙智—DevSecOps解决方案

rubygems 漏洞

刨析Scoped原理

猪痞恶霸

CSS 7月月更

万字多图,搞懂 Nginx 高性能网络工作原理!

C++后台开发

nginx 中间件 后端开发 高性能网络 C++开发

IPA应用探索:基于客户意图交互让业务受理更有“温度”

鲸品堂

运营商

后端实战教程:如何使用 Node.js 开发 RESTful API 接口(Node.js + Express + Sequelize + MySQL)

蒋川

node.js MySQL 后端开发 Express

Klocwork部署的安全最佳实践

龙智—DevSecOps解决方案

klocwork 静态代码分析 SAST工具

Flutter 构建三维空间动画效果

岛上码农

flutter ios 前端 安卓开发 7月月更

任务拆分中的「敏捷刺客」,你中招了吗?

LigaAI

团队管理 敏捷开发 需求管理 垂直拆分 需求梳理

企业知识管理过程中常见的误区与解决方法

Baklib

基础设施 NFTScan 正式发布 Solana 网络 NFT 浏览器

NFT Research

区块链 NFT

带你认识数仓的“规格变更”

华为云开发者联盟

数据库 后端 集群 数仓

AIRIOT物联网平台助力油库自动化升级 实现业务场景全覆盖

AIRIOT

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

一个月后,我们又从 MySQL 双主切换成了主 - 从!

悟空聊架构

MySQL 悟空聊架构 征文活动 7月月更

企业钟情于混合App开发,小程序容器技术能让效率提升100%

Speedoooo

微信小程序 APP开发 跨端开发 小程序容器

【Java】中的String、StringBuffer和StringBuilder的区别

工程师日月

Java’ 7月月更

体验SRCNN和FSRCNN两种图像超分网络应用

华为云开发者联盟

人工智能 图像 图像超分

P4Python:合并实践指南之如何脚本化integrate流程

龙智—DevSecOps解决方案

文件合并 P4 Perforce Helix Core

Hive表类型

五分钟学大数据

hive 7月月更

关于FAQ页面的一些制作技巧

Baklib

卷是真的卷,“粗心马虎”也是真的要扣分

图灵教育

数学 小学 初中

DevOps工具链:开放、自由地选择最适合团队和业务需要的工具

龙智—DevSecOps解决方案

DevOps DevOps工具 DevOps工具链

CloudBees CI使用Velero进行灾备(DR)概念验证

龙智—DevSecOps解决方案

ci 停机时间 灾难恢复计划

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