前端可用性保障实践

本文基于已发表在Infoq的“美团收银台前端可用性保障实践”一文编辑而成。

一般可用性都是说后端服务的可用性,都说我们的服务可用性到了几个9,很少有人把可用性放到前端来。其实对于任何一个有UI交互流程的业务,都会有前端服务可用性,后端的可用性做的再高,前端一个按钮写的有问题点击不起作用也会导致用户无法完成流程。

前端服务可用性包含三个部分:

  • 前端代码可用性(测试质量,线上异常)。
  • 静态资源服务可用性。
  • 网络链路可用性(DNS劫持、网络性能)。

既从业务后台服务往上,一直到用户界面,一切都是前端服务,这里面一切用户可能遇到的问题都是前端可用性的范畴。

这就是我们认为的前端可用性,收银台的可用性建设就是围绕着这三个部分展开的。

前端服务的可用性衡量和后端的衡量方法相类似,不考虑影响范围大小,只考虑存在故障的时常,最大化考量可用性。可用性指标不是为了让我们通过复杂的算法来减小事故对可用性计算的影响,而是为了激励我们在可观测范围内做到没有问题,越做越好。影响用户数、影响订单数、影响GMV等指标更多的是用于做事故定级。

前端代码可用性:

  • 空指针问题是困扰前端的一个大问题,由于JS本身是弱类型动态语言,无法在开发及编译过程中通过工具推导出可能出现问题的点,进而在前端研发过程中很容易疏忽造成空指针问题;
  • 业务逻辑覆盖率,指的是在业务项目当中,代码对动态逻辑的处理能力,往往在一些复杂的业务项目当中,逻辑混乱交错,前端的展示和进一步的动作由后端控制,这种情况下复杂的逻辑交织在一起产生无数分支,逻辑环境难以模拟,进而很容易在逻辑的处理上产生疏忽;
  • 兼容性,问题困扰着各个端的研发,对于前端来说,要面临的环境更多,包括平台、系统版本、浏览器版本、WebView版本、Hybrid桥版本等等,很难从测试角度全部覆盖。

静态资源服务可用性:

  • 前端静态资源服务链的稳定性,例如NGINX、Node等等;
  • CDN并不是任何时候都可以正常提供服务的,可能会遇到SSL证书链问题、回源服务可用性问题等等。

网络链路稳定性:

  • DNS劫持是一个老大难问题,大部分情况下是运营商为了节省跨省流量结算的费用而进行DNS劫持,走内部的缓存,还有一部分情况是广告,想象一下把收银台的代码劫持并插入一个运营商广告是有多可怕。

大块的问题就是上述几种,细枝末节的问题就不在这里一一细表,那么具体我们是怎么解决的呢?

记得刚刚开始负责支付业务的时候,老板(rank)经常问一个问题:“收银台稳定性怎么保障?”,我当时想的就比较简单,无非就是流程保障、测试保障等等,但这不是老板想听的,不然他也不会老问我,显然是当时没有回答出他想要的答案。现在想想真是“too young too simple, some times naive”。

1

在美团,收银台是一个横向的业务基础服务,是所有业务的闭环环节,所有线上业务交易的最终环节全部由收银台来完成,它的重要性不言而喻。对于收银台来说,有三点需要保障,这三点分别是可用性、体验和安全,它们共同为一个指标服务,那就是“支付成功率”。其中,对支付成功率影响最大的就是可用性。

可用性对支付成功率的影响有多大?

一个小小的bug上线后即使及时发现并回滚,可能也会造成几百上千万营业额的损失,这对整个团队来说都是无法接受的。所以,对于收银台来说,保障可用性是第一优先级。

同时,支付作为一个特殊的业务有它对可用性独到的要求,在可用性保障上必然不是任何业务都会用到的那老几样儿。老板想听的是对稳定性保障的独到见解,可复制的方法,有可用性保障的理论基础,让任何一个日后负责这个业务的人都能够照方抓药,保障前端服务的稳定性。

现在总结起来可用性的保障分为三个阶段: * 事前 * 事中 * 事后

保障手段分为三个大类: * 软的 * 硬的 * 根源的

“软的”是指用“人”来保障的部分: * 流程保障 * 规范保障 * 测试保障 ……

“硬的”是指用“工程工具”来保障的部分: * 静态代码检查 * 单测 * Web自动化测试 * 持续集成 * 线上前端异常监控 * 业务异常监控 * 前端服务异常监控 * 网络异常监控

“根源的”是整个可用性保障的核心,是指通过“技术选型”来让系统更健壮,这里面有两个核心点。

技术选型要简单稳健

要求在具备伸缩性的基础下避免任何复杂的不可控技术方案。核心链路上的所有代码,团队要具备维护能力,要减少外部依赖。

这里面有一个关键的选型概念就是“场景契合度”,技术选型不是你愿意用什么,你熟悉用什么,是在这个业务场景和团队规模下需要你用什么。

举个例子,收银台是一个单页应用,之所以设计成单页应用是因为它涉及到的视图跳转和数据传递太多,单页应用相比多页更具优势。那么在选型的时候我们当时有React、Angular、Ember等一线前端SPA框架可以选,但最后我们还是自己做了一个简单的视图生命周期管理工具,为什么?

  • “场景契合度”,React和Angular等前端框架更适合极端复杂的大型单页应用,为了能够更好的处理这种复杂度采用了一系列厚重的工具去约束研发的过程,其中还包含一些这个项目不会遇到问题的优化,例如渲染优化等等。对于收银台来讲,单个视图中的复杂度并没有那么高,可以遇到前端渲染性能瓶颈的项目并不多。

  • “源码维护能力”,收银台作为核心链路中的核心业务,在技术上绝对不允许被动,团队必须具有核心代码的维护能力。而依照我们当时的团队规模,这是不现实的。

在收银台这个SPA场景里,我们只需要视图生命周期管理这个功能。所以,我们参考Cocoa View Controller的生命周期设计实现了一个简单的单页视图工具“Cyra”,它只负责视图生命周期的管理,简单、拓展性高、源码可维护且无外部依赖。

避免出现核心链路上的可用性短板

2

5

举个例子,网页首帧渲染优化有三种常见方式: * 手工预渲染 * 编译预渲染 * 服务器预渲染(SSR)

其优化的核心内容就是把尽可能多的首帧渲染所需信息在第一个请求的响应中给出,也就是主文档请求,让用户能够尽可能快的看到内容。

从优化效果上来讲,SSR的效果最好,它可以把JavaScript(以下简称“JS”)、CSS、HTML以外的动态的数据一起通过第一个响应返回回来。

但是,最后我们选择的是编译预渲染,为什么?

先说什么是SSR。这个概念是新提出来的,但原理很早就存在,类似JSP、ASP这种技术早年间一直都是SSR,在服务器端把页面拼装好传递给客户端。和佛家的人生三境界一样,禅中彻悟后又回去了,就像现在的前端服务化很难做到当年微软ASP.NET Web Form那个水平。

后来前端行业发展迅速,发生了两个大的变化:

  • 大家开始做前后端分离,把静态资源单独管理,好处就不说了,有一个弊端就是当用户浏览器把静态资源下载下来后可能还需要另外一个请求去获取这个页面上的动态数据;
  • 前端工程化的兴起,大家会把CSS JS HTML结构统一打包到一个JS文件中,HTML中只有JS的引用,这样就导致HTML下载完成后还是白屏,只有等到这个巨型JS下载完成后首帧内容才开始渲染。

这时就用到了SSR,通用做法是增加一个Node层,在服务器端做首屏内容的拼接,包含静态数据,这样能够保障首帧渲染不仅快,还包含首屏所需要的数据。其架构如下图:

3

可以看到,Node这一层在我们界面请求的核心链路上,Node本身的可用性和上下游的服务相比要差很多,其自身的稳定性需要许多其他工具去保障,那么对于这块业务来说,Node这一层成为了“核心链路上的可用性短板”,这样即使背后的各个后端系统可用性再好,只要Node这一层挂掉就会造成用户无法访问的问题。

所以基于“避免出现核心链路上的可用性短板”这一层考量,我们退而求其次选用“编译预渲染”,在编译期间把首屏结构全部拼装好,这样可用性就得到了保障。

关于Node在服务端的应用上,我认为其实大多数情况下,不用要比用要难得多,关于这方面的一些思考可以详见后续文章《服务端为什么不能用Node》。

理论有了,我们是怎么做的?

“软的”流程规范部分就不展开讲了,各个团队都差不多,只不过是完善不完善的差异。接下来主要讲一下“硬的”部分。

前文提到,“硬的”保障主要指的是工程工具的保障手段,工程工具很多,这里对应前文几大问题的顺序,讲一讲我们的解决方案。

前端代码可用性部分主要有三个容易出问题的点:空指针、业务逻辑覆盖率、兼容性。

空指针

“空指针”部分的问题解决只能从语言本身来解决,JS本身是弱类型动态语言,无法在开发及编译过程中通过工具推导出可能出现问题的点。针对这一点我们从2015年开始实践TypeScript(以下简称“TS”),当时也看了Facebook的Flow,但当时Flow还不够成熟,所以没有选用。

引入TS后,将我们的弱类型语言变成强类型语言,从编码过程中就可以帮助过滤掉很大一部分空指针问题,TS强大的类型推导系统可以帮我们分析出系统中的空指针隐患,进而可以解决线上99%的空指针问题。当然TS还有很多其他好处,这里就不展开了。

4

业务逻辑覆盖率

“业务逻辑覆盖率”这个问题的背景不再赘述,由于收银台的复杂度高、case多,复杂情况下的后端状态很难模拟,因此只能采用自动化工具去解决,这就涉及到了“Web自动化流程测试”。

Web自动化流程测试在这种场景下除了可以验证case的正确性以外,最重要的功能就是要有一个异常强大的case管理模块。业界目前并没有理想的工具能够支撑我们的场景。

美团内部有一个我们参与需求的Web自动化流程测试工具“Freekite”,它在case验证功能的基础上,有一个强大的可视化case管理模块,支持复杂的case细分。除了界面操作的细分外,可以全量Mock或部分Mock后端的数据响应,根据响应拆分出不同的case分支。除此之外,还包含智能自动化断言功能,断言基本不需要人工参与。

可能有人要问了,这个case录完以后万一遇到界面改版怎么办?没关系,虽然有强大的相似度匹配功能,Freekite还支持单独节点的重新录制,也就完美的解决了case的维护问题,大幅度减少工作量增强效率。紧接着我们会在项目中增加Freekite的持续集成,在项目的每一个阶段进行流程上的自动化回归验证,业务逻辑覆盖率的问题就基本解决了。下图为Freekite可视化Case管理。

6

兼容性

“兼容性”问题公司内部有云测平台,可以快速在多机型真机上回归主要流程,可以通过云测平台覆盖占有率95%以上的各种机型。然而兼容性也是一样,需要从根本上选用一个可靠的选型,从而避免在处理兼容性问题上会遇到的拆东墙补西墙最后还是不放心的尴尬境地。兼容性问题在移动端除了布局外主要出现在两种操作中:点击和滚动。

前文描述的自主研发的单页视图工具就以最简单的div隐藏显示的方式来处理视图切换,使所有元素处于正常的文档流当中,点击处理也通过分级降级的方式最大化平衡体验和兼容性,从而保障了整个项目的兼容性。

静态资源服务可用性主要就是NGINX层的健康检查及CDN的回源监控,这一点公司SRE有强大的系统支持(有关美团SRE的实践可以参考之前的博客文章),这里就不多讲了。

网络可用性上最头痛的问题是DNS劫持,前文讲到了DNS劫持方面除了恶意劫持以外,主要是运营商以节省跨省流量结算费用为目标进行DNS劫持。当运营商系统发现HTTP访问的域名时会在区域内的服务器中缓存一份资源,后续用户再请求的时候其域名解析会被解析到运营商的服务器上去由运营商的服务器直接返回内容。

其应对方法只有使用HTTPS,但并不仅仅是在原有的域名HTTP的基础上切换HTTPS那么简单,还需要保障这个域名不支持HTTP访问并且没有被大范围使用HTTP访问过。如果不这样做的话会出现一个问题,运营商在DNS解析的时候并不知道这个域名是用什么协议访问的,当之前已经记录过这个域名支持HTTP访问后,不管后续是否是HTTPS访问,都会进行DNS劫持。这时如果使用的是HTTPS访问,会因为运营商的缓存服务器没有对应的SSL证书而导致请求无法建立链接,从而遇到请求失败的问题。在之前业务切换HTTPS的时候就遇到了这个问题,请求成功率从99.96%降低到了96%,花了大量的时间去定位问题。当切换了全新的域名后这个问题才得到了解决。

在事后方面,除了强大的支付后台业务系统监控外,公司还有完善的通用监控系统,例如异常监控系统可以分级分批上报前端的JS Error及自定义异常,性能监控系统Performance可以了解前端的访问情况做性能分析,网络监控系统CAT可以快速定位网络层性能状况、区域DNS劫持状况等。

作者简介

禹霖,美团前端技术专家,负责金融钱包及支付前端团队。

最后,我们正在招人,美团金融服务平台招聘Web前端研发工程师,欢迎想的多做的多的有志之士加入,简历发送至chenyulin[at]outlook.com。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/478923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 762. 二进制表示中质数个计算置位

1. 题目 给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数。 (注意,计算置位代表二进制表示中1的个数。例如 21 的二进制表示 10101 有 3 个计算置位。还有,1 不是质数。) …

报名通道开启 | 顶会 ICLR 2021:医疗对话生成与自动诊断国际竞赛,邀你来战!...

ICLR,2013 年由深度学习三巨头中的Yoshua Bengio 和 Yann LeCun 牵头创办,已受到研究者和开发者的广泛认可,是当之无愧的深度学习领域顶级会议。今年,由中山大学、加利福尼亚大学圣迭戈分校和腾讯天衍实验室等组织联合举办的医疗对…

论文浅尝 | 图神经网络的对抗攻击和防御相关文献集

本文转载自公众号:专知。作者:Wei Jin。导读:本资源整理了关于图形数据或GNN(图形神经网络)上的对抗攻击和防御的论文链接。并对其进行分类。目录Survey PapersAttack PapersDefense PapersCertified Robustness Papers地址连接:h…

李宏毅《机器学习》作业班+带打比赛

人工智能来势汹汹,学习人工智能该从哪里开始呢?人工智能的学习路径又是怎样的?须知入门人工智能第一步就是机器学习。但是,在上千份同学的学习反馈中,我们发现了2个人工智能学习领域的痛难点:1、课程偏理论…

论文浅尝 – KDD2020 | 使用图对比编码的图神经网络预训练模型

论文笔记整理:陈名杨,浙江大学在读博士生,研究方向为知识图谱表示学习。图表示学习是一个当前关注度较高的领域,并且有许多真实的应用。然而当前的很多图表示学习方法都是对一个领域或者某一个图训练一个模型,也就是说…

LeetCode 575. 分糖果(set集合去重)

1. 题目 给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果。你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数。 输入: candies [1,1,2,2,3,3] 输出: 3 解析: 一共有三种种类的糖…

Android官方开发文档Training系列课程中文版:键盘输入处理之指定输入的类型

原文地址:http://android.xsoftlab.net/training/keyboard-input/index.html 引言 在文本框接收到焦点时,Android系统会在屏幕上显示一个软键盘。为了提供良好的用户体验,你可以指定相关输入类型的特性,以及输入法应当如何展现。…

美团 R 语言数据运营实战

一、引言 近年来,随着分布式数据处理技术的不断革新,Hive、Spark、Kylin、Impala、Presto 等工具不断推陈出新,对大数据集合的计算和存储成为现实,数据仓库/商业分析部门日益成为各类企业和机构的标配。在这种背景下,是…

天天说常识推理,究竟常识是什么?

文 | 花小花Posy写这篇文章的时候,我去搜了搜常识的例子。“睁开眼睛打喷嚏是不可能的。(还真没留意。)““北极熊是左撇子。“”长颈鹿没办法咳嗽。”呃?好吧,我需要补一补自己的常识。那么这些所谓的“常识”真的是常…

论文笔记 | Counterfactual Samples Synthesizing for Robust VQA

论文笔记整理:窦春柳,天津大学硕士。来源:CVPR 2020链接:https://openaccess.thecvf.com/content_CVPR_2020/papers/Chen_Counterfactual_Samples_Synthesizing_for_Robust_Visual_Question_Answering_CVPR_2020_paper.pdf动机当今…

Android消息总线的演进之路:用LiveDataBus替代RxBus、EventBus

背景 对于Android系统来说,消息传递是最基本的组件,每一个App内的不同页面,不同组件都在进行消息传递。消息传递既可以用于Android四大组件之间的通信,也可用于异步线程和主线程之间的通信。对于Android开发者来说,经常…

论文浅尝 - ICLR2020 | 知道什么、如何以及为什么:基于方面的情感分析的近乎完整的解决方案...

论文笔记整理:余海阳,浙江大学硕士,研究方向为知识图谱、自然语言处理。链接:https://arxiv.org/abs/1911.01616动机基于目标的情感分析或基于方面的情感分析(ABSA)是指在细粒度的层次上解决各种情感分析任…

全栈深度学习第5期: 神经网络调试技巧

一起追剧鸭简介Berkeley全栈深度学习追剧计划是由夕小瑶的卖萌屋发起的优质公开课打卡项目,通过微信群为同期追剧的小伙伴提供交流平台。关于该计划的详请见这里。Berkeley深度学习追剧群目前已有1000小伙伴加入,公众号后台回复口令 深度学习追剧 入群。…

LeetCode 22. 括号生成(回溯/DP)

文章目录1. 题目2. 解题2.1 暴力回溯2.2 DP1. 题目 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。 例如,给出 n 3,生成结果为:["((()))","(()())",…

美团服务体验平台对接业务数据的最佳实践-海盗中间件

背景 移动互联网时代,用户体验为王。美团服务体验平台希望能够帮助客户解决在选、购、用美团产品过程中遇到的各种问题,真正做到“以客户为中心”,为客户排忧解难。但服务体验平台内部只维护客户的客诉数据,为了精准地预判和更好地…

中文近义词工具包:Synonyms

Synonyms Chinese Synonyms for Natural Language Processing and Understanding. 更好的中文近义词:聊天机器人、智能问答工具包。 synonyms可以用于自然语言理解的很多任务:文本对齐,推荐算法,相似度计算,语义偏移…

惊了,掌握了这个炼丹技巧的我开始突飞猛进

文 | 夕小瑶从不拖稿的小夕今天在知乎上刷到一个问题:哈?一向求真务实、高逼格讨论的知乎画风怎么突然就不一样了。我以为回答区会有这张图:▲如来神掌结果竟然没有!知乎果然没有让我失望,还是一如既往的认真、严谨、有…

LeetCode 876. 链表的中间结点(快慢指针)

1. 题目 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 2. 解题 快慢指针法 class Solution { public:ListNode* middleNode(ListNode* head) {ListNode *fast head, *slow head;while(f…

技术动态 | 多模态知识图谱

本文转载自漆桂林老师的知乎专栏。原文链接:https://zhuanlan.zhihu.com/p/163278672作者:郑秋硕,漆桂林,王萌知识图谱技术已经被广泛用于处理结构化数据(采用本体D2R技术)和文本数据(采用文本信…

美团配送系统架构演进实践

写在前面 美团配送自成立以来,业务经历了多次跨越式的发展。业务的飞速增长,对系统的整体架构和基础设施提出了越来越高的要求,同时也不断驱动着技术团队深刻理解业务、准确定位领域模型、高效支撑系统扩展。如何在业务高速增长、可用性越来越…