70+专家分享实战经验,2024年度AI最佳实践都在AICon北京 了解详情
写点什么

苏宁零售云 App 稳定保障实践

曹银飞

  • 2018-11-01
  • 本文字数:2492 字

    阅读完需:约 8 分钟

苏宁零售云 App 稳定保障实践

1. 背景

苏宁零售云目标 T4-T6 级市场的业务,定位更靠谱的智慧零售解决方案和零售服务集成商,实战式跨界赋能。苏宁易购 TO C 的经验丰富,相关的方案很完善,但是零售云 TO B 相关业务启动后,业务增长迅速,App 相关的稳定保障方案缺失。

2. 零售云业务的特殊性

零售云主要是 TO B 的业务,目标 T4-T6 级市场的加盟店,授权店,跟 TO C 业务相比,有以下有个不同点:

1)用户量不多,但是每个用户强依赖零售云相关 App。
2)每笔订单金额巨大。
3)需要系统稳定。

零售云的每个用户都是一家门店的一个角色人员(老板,店长,收银员…),每家门店每天的进销存都依赖零售云配套 App(零售云,零售云店员,零售云管家)。零售云 App 提供进货服务,零售云店员提供销售服务,零售云管家提供库存管理,报表查询等服务。可以看出,一个用户使用出现问题,就会影响到一家门店的日常销售,导致不能正常销售,每一家门店每天都付着店面租金和人员酬劳,不能营业的后果非常严重。

3. 前期快速迭代满足业务遇到的问题

1)系统问题需要门店上报给运营,运营再同步给研发负责人,问题的流程较长响应比较慢。

2)研发需要跟门店人员确认操作过程,甚至借用登录账号,体验不好。

3)App 到数量的灰度发布,不能精确试点,一旦出错,影响范围较大。

4. App 稳定保障思路

系统稳定的三个特点:可监控,可灰度,可回溯。对于 App 来说,一旦新包发出去后,想回溯就不太现实了,办法无非是提示更新或者热更新,所以我们主要针对前面两点来实现。

4.1 可监控

在监控上我们做了两个方面的工作:

1)云迹性能监控,类似友盟或者 Buggly 的性能统计,包括崩溃,卡顿,日活等等;
2)云迹实时日志统计分析。

4.2 可灰度

1)实现到店铺层面的灰度更新

下面我们来展开讲讲这两点的实现方式。

5. 到人的请求监控(可监控)

类似友盟或者 Buggly 的性能统计,我相信大部分 App 也都接入了,这边不做解释了,不管 TO B 还是 TO C 业务都一样。

正是基于上面的性能统计,我们得知,零售云 App 的使用用户,60% 左右是在 WIFI 环境下。上面也解释了 TO B 业务对系统的强依赖性,但是对于流量消耗的敏感度却不高。基于前提条件,我们决定把客户端所有的网络请求数据和业务错误轨迹都记录在云迹平台,并且配置错误告警。这样做的好处有两个:1)通过短信和邮件告警,可以快速知道错误。2)通过实时日志埋点可以知道每个用户的行为和操作轨迹,方便快速定位错误。流程图如下所示:

image

5.1 异常告警

我们根据自己的需求,配置搜索条件,告警触发条件,并以短信和邮件的方式通知给对应的负责人。如下图所示:

image

当有异常触发告警条件时,对应负责人会短信和邮件收到告警通知,第一时间发现问题。

5.2 日志查询

1. 当收到告警后,对应负责人需要登录到云迹实时日志分析平台 1) 选择对应的系统名 2) 选择日志类型 3)选择查询时间 4) 通过 kibana 查询语法,即可查询到该条件下的日志。

image

2. 我们随便点开一条日志,可以看到详细的用户信息。

image

根据上图日志内容可以快速获取如下关键信息:

1)app 版本
2)手机版本,手机型号
3)业务信息(请求地址,请求参数,返回参数,堆栈信息)
4)账号

通过上面信息可以快速定位到某个时间点下错误的请求。

3. 某个用户轨迹

很多时候,某些错误是在用户特定操作下才会触发,这个时候,需要知道用户的操作轨迹,我们可以通过 kibana 查询语法,筛选出某个用户的所有日志,根据请求时间可以很方便的知道,用户的整个操作轨迹。如图所示,该用户最近三小时的操作行为都可以查到。

image

得到用户的行为轨迹,很多错误场景,研发可以自己模拟,不需要再远程咨询门店用户,方便高效定位问题。

6. 到店的移动 App 灰度发布(可灰度)

TO C 的场景一般是用户量的灰度,比如一次灰度 10000 个用户,但是对于 TO B 却不适合,比如一次灰度 100 个用户,可能覆盖到 100 家店铺,一旦出问题这 100 家店铺正常销售受到影响,而且统计哪些店铺受到影响也很困难。针对零售云特殊的情况,我们制定了特殊的灰度发布流程。每个 app 在苏宁升级平台(MPCS)上面配置两个 appid,一个为正式版本包,一个为灰度版本包,客户端根据分销前台返回的 appId(0/1),区分取正式包还是灰度包的 appid,进行版本更新请求。灰度期间,通过分销前台配置店铺白名单,在白名单文件中的店铺下的用户提示升级到最新版本,其他用户无影响。在灰度成功后,分销前台关闭灰度开关,进行全量升级。流程图如下所示:

image

灰度期间只有白名单用户才调用灰度包更新接口,其他用户调用正式包升级接口。逐步增加灰度的店铺,10 个 ->20 个 ->50 个 ->100 个 -> 全量,期间注意观察云迹异常。

7. 避免的生产问题

通过上面的稳定保障,我们避免了不少生产问题,这边举两个例子:

1)四月份的一个下午,突然收到很多告警,打开云迹实时日志查到一个小时内报大量的请求超时,而且集中在某个区域,通过这些关键信息,最后定位是运营商网络的问题,当天就快速修复,对于用户来说对于整个修复过程无感知。

2)云迹告警商品详情页接口会偶尔失败,通过云迹查询到日志信息发现,商品详情页需要传的店铺编码,某些时候客户端传的是空,但是 review 客户端相关模块代码,确认每次都是传了店铺编码,这个时候就需要模拟用户的操作轨迹。通过查询该用户所有操作日志,分析出失败接口前面几分钟的操作行为得知,在四级页停留了很长时间后登陆失效,再次登陆后店铺编码为空,知道具体错误后,就可以在下个版本修复避免生产问题。

8. 目标展望

为了保障零售云 App 的稳定,我们其实还做了很多工作,这里不一一列举了,当然我们还有很多的提升空间,未来我们会不断优化监控和灰度方案,加强数据收集和分析,保障零售云 App 的稳定。再稳定的系统也不能保证百分之百不出问题,所以在应对可能出现的问题时,我们必须要在第一时间发现问题,快速响应解决问题。

作者简介

曹银飞,苏宁易购 IT 总部 Android 技术专家,拥有多年 Android 研发和管理经验。曾就职于联创,腾讯等大型互联网公司,现负责苏宁易购 Android 开发部产品研发与技术管理工作,在 Android 项目架构设计,性能优化,团队管理上有多年的实战经验。现致力于打造苏宁智慧零售相关 App,希望将苏宁的零售技术能力发挥到极致。

2018-11-01 14:5914106
用户头像

发布了 164 篇内容, 共 107.0 次阅读, 收获喜欢 392 次。

关注

评论 2 条评论

发布
用户头像
1
2018-11-03 14:57
回复
没有更多了
发现更多内容

数据中台坠落神坛,数据服务平台闪亮登场,阿里、快手又整烂活?

雨果

数据中台

数据湖(五):Hudi与Hive集成

Lansonli

10月月更 Hudi与Hive集成

golang中的init初始化函数

六月的

golang init

计算机体系结构“圣经”新版,图灵奖得主扛鼎之作,影响无数技术人

图灵社区

计算机体系结构

树莓派4B安装docker-compose(64位Linux)

程序员欣宸

Docker 10月月更 树莓派4

华为云从入门到实战 | AI云开发ModelArts入门与WAF应用与部署

TiAmo

华为 华为云 云开发 10月月更

如果你看不懂别人画的 UML 类图,看这一篇文章就够了

跟着飞哥学编程

Java设计模式 10月月更 UML类图

第K个语法符号

掘金安东尼

算法 10月月更

经历了6个月的失踪,我将带着干货终究归来!【RocketMQ入门到精通】

洛神灬殇

1024 10月月更

区块链架构的层级:第 0、1、2、3 层介绍

devpoint

区块链 10月月更

Flash软件应用项目(三)

张立梵

设计师 Flash 10月月更

Photoshop软件应用项目(三)

张立梵

设计师 ps 10月月更

在线问题反馈模块实战(五):实现对通用字段内容自动填充功能

bug菌

springboot 项目实战 10月月更

Redis的string内存消耗为何如此之大

芥末拌个饭吧

后端 redis 底层原理 10月月更

2022年8月银行APP月活跃人数盘点

易观分析

手机银行 8月

计算机体系结构“圣经”新版,图灵奖得主扛鼎之作,影响无数技术人

图灵教育

计算机体系结构 图灵奖

“全球金牌课程”【11月CSM认证】国际Scrum联盟认证导师CST授课 | 火热报名中

ShineScrum捷行

Scrum CSM 敏捷项目 ScrumMaster认证

HashMap源码分析(二)

知识浅谈

hashmap 10月月更

优雅代码的秘密,都藏在这6个设计原则中

小小怪下士

Java 接口

【一Go到底】第二十天---闭包

指剑

Go golang 10月月更

golang中的接口

六月的

golang interface

在线问题反馈模块实战(六):接口文档定义

bug菌

springboot 项目实战 10月月更

【LeetCode】连续子数组的最大和Java题解

Albert

算法 LeetCode 10月月更

Redis哨兵机制了解一下

芥末拌个饭吧

后端 redis 底层原理 10月月更

“程”风破浪的开发者|你真的会用Redis做消息队列吗

芥末拌个饭吧

学习方法 redis 底层原理 10月月更

Linux下内存空间分配、物理地址与虚拟地址映射

DS小龙哥

10月月更

命名规范与原则

Appleex

代码人生 命名规范

在线问题反馈模块实战(四):封装通用字段类

bug菌

springboot 项目实战 10月月更

创建容器镜像:如何编写正确、高效的Dockerfile

okokabcd

Docker

群主发红包带你深入了解继承和super、this关键字

共饮一杯无

Java 关键字 10月月更

基于强化学习的测试日志智能分析实践

华为云开发者联盟

人工智能 测试 华为云 强化学习 企业号十月 PK 榜

苏宁零售云 App 稳定保障实践_语言 & 开发_徐川_InfoQ精选文章