美团扫码付的前端可用性保障实践

开篇

2017年,美团金融前端遇到了很多通用性问题,特别是在保障前端可用性的过程中,我们团队也踩了不少“坑”,在梳理完这些问题以后,我们还专门做了第31期线下沙龙给大家进行了分享。不管是在面试过程中与候选人讨论,还是在团队内的和我们前端小伙伴讨论,都能发现很多同学有一个共同点,对所做的工作缺乏判断,包括如何评判工作交付的质量,如何评判产品与客户之间的触达率等等,这些问题其实比“埋头敲代码”重要很多。

今天抛砖引玉,分享一下我们团队的思考,希望能帮助更多的同学对前端可用性的保障工作,有一个更全面的认识,后续还会分享很多美团前端相关的内容。我们会做成一个系列,对前端感兴趣的同学,可以关注我们美团技术团队(meituantech)的公众号,也欢迎大家跟我们一起交流、讨论。

业务介绍

近几年,随着移动支付的普及,衍生出来聚合支付产品逐渐成为了大家进行移动支付第一选择。而对美团金融平台而言,支付这件事的意义和挑战就完全不一样,我们把它定义为“搭载火箭的冰山式服务”。之所以称之为“火箭”,是因为我们在过去一年中,迅速成为公司又一个日订单千万级的业务,整个业务是火箭式的发展速度。为什么叫“冰山式的服务”?这是因为,通过我们平台的一个二维码、一个页面就可以实现扫码支付,虽然操作比较简单,但是其背后却涉及很多商家系统、供应链系统,而且还需要很多平台系统的支撑,对技术和系统稳定性的要求非常之高。但对用户来说,他们只是看到了“冰山一角”。

前期,我们在做服务设计的时候,我们以为这个产品就是一个很简单的服务,按照传统前端的定义,我们只是把前端的多个界面完成就可以了,后端服务以及很多第三方的接口我们不需要花太多精力去关注。但是真正接触到项目后,我们发现金融服务跟传统的服务完全不一样,甚至还需要做政府方面的一些工作,比如金融最大的问题要合规,这就导致很多业务设计上,必须强制做很多功能节点,随着业务发展过程中节点越来越多,这必然导致服务的可用性越来越差,可能实际情况比下面这张图更复杂。

当我们把产品串起来之后,发现有很多端,每个端同时又有很多的逻辑线互相交叉,这就造成了整个产品和前端服务在快速发展过程中缺乏设计性,同时也缺乏可靠性、稳定性的保证。

很多同学天真的认为,前端服务应该像奥尼尔一样稳定、强壮。但是实际情况,更可能像下了班后“葛优躺”的那种状态。今天我们讲的目标就是:

如何提高自己对所负责业务服务的信心?

之所以提这个目标,是因为有次在休假的过程中,老大问能不能保证你负责的服务不会出问题。相信很多同学都会遇到这种情况,在出去度假或者看电影时,突然接到老大的电话,对于大家来说,这种事情出现直接会影响到生活质量。所以,保障服务的可用性,其实也是提高大家生活质量的重要因素。本文将会从四个方面进行分享:

第一,如何定义的前端可用性。

第二,影响前端可用性的关键因素是什么。

第三,解决这些关键问题的处理方式,或者说端到端监控与降级处理的方案。

第四,总结一下标准的前端保障的工作流程,希望能对大家有所启发,最好能应用到自己的工作之中。

扫码付前端可用性定义

大家对于“系统可用性”这个概念都不陌生,其定义也比较简单,比较好理解,业界通用的计算公式是:

%availability=(Total Elapsed Time-Sum of Inoperative Times)/ Total Elapsed Time

也就是 平均无故障时间/(平均无故障时间+平均故障修复时间) 的百分比。

但是,前端和后端对这个可用性的认知并不一样。因为对于后端服务的可用性来说,执行环境较为可控,基本上不会存在中间的状态。而前端服务却大为不同,前端会面临各式各样不确定的用户使用场景。比如,我们使用iPhone访问没有问题,测试的同学使用小米6也没有问题,但是老板用的华为P10就有问题了。

所以,前端服务的可用性无法像后端一样,可以有准确的数字指标,或者精确的定义公式。当然,这也是前端可用性提升面临的问题,因为我们无法将最终的工作归结在一个衡量指标上。

这里给大家留一个思考题:如果你负责的业务提高了万分之一的可用性,对整个业务能够产生多大大价值?

在美团金融,我们团队粗略算过,如果业务的可用性提高万分之一,对业务部门的价值提升,至少在五位数以上。可以说,不积跬步,无以至千里。可以说,在前端领域,任何一点微小的进步或者提升,都值得我们付出百分之一百的努力。

影响可用性的关键因素

我们把2017年前端发生的故障分为四种类型:

  1. 客户端升级兼容性问题:在做前端开发时,很多组件依赖于容器。比如美团App升级,但是在升级时可能并不会通知所有的业务方,而升级难免会造成兼容性问题,这种情况会造成业务不可用,甚至带来其他相关的问题。这个问题没有办法完全避免。

  2. 代码优化、服务迁移后遗症:代码优化和改造,这点也不可避免。因为技术在更新代码的过程中,很难兼顾到所有的细节问题,容易造成线上事故。

  3. 外部依赖服务故障:这是比较典型的问题,对于前端来说,最常见的就是接口服务或者依赖的基础服务组件出现故障,这些都会导致前端业务的不可用;

  4. 研发流程执行不彻底:其实代码优化层面的问题,可以通过流程或者标准化的动作进行规避。但实际过程中,很多问题是因为投入的精力有限,或者着急上线等因素,导致研发执行的不彻底或者不规范。

虽然看起来很复杂,但是归根结底可以概括成两大类:

第一类问题,就是我们自身的问题,可以比喻成“我撞在猪身上了”;第二类问题就是别人的问题,可以理解成“猪撞我身上了”,我们经常说这样一句话,“不怕神一样的对手,就怕猪一样的队友”,在前端开发问题上,这个道理一样适用。

内部节点可用性

第一点就是如何把自己的事情做好。相信很多同学都看过网上很多文章,也听过线下很多大牛的分享,都非常有经验了。这里还有几个需要强调的地方:

  1. 流程规范:很多的前端事故的主要原因就是流程不规范,所以建议整个研发流程要用SOP来规避一些问题。比如上线的准入标准,服务必须达到一定的标准才能上线,在没有明确之前不准上线等等。

  2. 方案合理:需要根据不同的业务场景,来完成合理的方案设计,之前总结过一篇文章《前端常见开发模式及相关技术介绍》,这篇文章里讲到了三种不同的业务场景,以及他们适合什么样的技术方案。如果大家不知道选择什么样的技术方案,那么我们给的建议就是,尽量选择简单。这样的目的是,当真正发生问题的时候,能够快速解决问题,很多前端开发同学属于“热闹驱动式”选型,但在优化时却无从下手,这点并不可取。

  3. 代码规范:一般而言,很少有前端代码写的不规范,但是可以在流程和制度层面进行额外的要求。很多时候,前端的语法要求不是特别严格,但是服务可用性有额外的要求,代码规范,可以帮助规避简单的问题。

除了上述三点之外,还有一点建议提升测试的效率,虽然整个行业都在做,但是也不是特别理想。之所以提倡单元化测试和自动化测试,主要是因为可以帮助我们减少工作流程中重复的工作,将更多时间投入到业务开发层面。目前,已经实现了Android容器上的自动化测试,同时我们也在使用一些标准规避容器和外部依赖造成的故障。

外部链路的可用性

对技术同学来说,在做任何一个服务的时候,我们经常喊的口号都是“简单可依赖”。但是在现实中,“简单可依赖”几乎是不存在的,没有任何一个人敢说自己负责的服务能够达到简单可依赖,这只是愿景而不是现实。

我们使用外部服务的时,怎么保证它的可用性呢?对于前端开发者来说,外部服务主要分为资源的可用性和接口的可用性,接下来我们依次进行分析:

静态资源的可用性

对于前端工程师来说,静态资源的不可用,主要分以下三种情况:

  1. 资源加载问题:在一个临时的弱网环境下,文件加载失败,比如说电梯间或者一个封闭的过道。

  2. 网络劫持问题:代码篡改的问题,静态资源在经过一些网络运营商时,被进行篡改或者注入广告。

  3. 代码执行问题:可能是兼容性问题,也可能是代码语法或者逻辑出现问题。

针对第一个问题,因为静态资源主要分为CSS文件和JS文件,CSS文件与我们的核心业务无依赖关系,所以加载失败的时候进行重试,保障页面样式可还原。

而JS文件涉及一些依赖的文件,所以我们采用一个比较稳妥的方案:在判断核心的JS文件加载失败时,降级为一个MVP的版本,来保障交易的正常进行。如右图所示,在没有做静态资源降级之前,这个门店是正常的会员门店,会有促销的活动和信息。在CDN出现问题时,它会出现白屏问题。而在经过降级处理之后,我们可以把整个页面回退成普通的门店,就不包含营销或者促销信息了。

整个方案有一个核心点,就是在CDN不可用时进行降级或者重试的过程中,还会遇到不可用的情况,我们最终要把资源回到源服务,至少保障在源服务上可以提供一个静态的页面提供给用户。这里也存在一个风险点,如果资源挂掉的话,源服务能不能承受CDN回源产生的额外流量?这个大家需要打一个问号,也需要特别注意。如果采用这样的方法,一定要评估好服务能不能承受这么大的压力。

第二个问题,大家都比较头疼。因为运营商是以省为单位运营的,所以在跨省的资源请求上会造成额外的流量,基于这个问题,每一个省级运营商都会想办法节省流量,对于流量大的资源有可能会进行劫持甚至篡改。

首先是要预防,一个简单的方案:全部把域名全部升级为HTTPS,让劫持篡改失去了价值,这样可以降低一些风险。如果还支持HTTP访问,依然还会存在被劫持的风险。

其次,在发现劫持问题后,要快速帮助用户修复。美团运维有统一的120模式,这个模式会帮助我们收集一些用户的环境信息,包括网络信息、手机版本号等等,从而快速定位这个问题,全力保障用户体验。

最后是监控,流量劫持都是以省级为单位的,所以在资源监控上,我们要求至少要做到省级,最好能够做到市级,如果发现某一个市、某一个省静态资源发生问题,就第一时间启动修复。

还有一个隐性问题,就是在CDN回源的时,资源请求是不是应该使用HTTPS?在这个问题上,因为考虑到性能,回源请求会使用HTTP。所以普遍来讲,CDN文件的请求会使用HTTPS,意味着我们使用HTTPS来保证CDN不会被劫持,但是CDN回源会造成风险,相当于HTTPS预防这种方式,在理论上不能完全解决这个问题。

最后,还有一个代码执行层面的问题。我们会把报错信息,及时上报到平台上进行分析和处理,目前美团使用统一监控方案CAT,现在已经开源了。

接口服务的可用性

很多前端开发同学有一个很大的误区,接口不可用并不是前端的问题。很多同学会先定位这个问题属于自己还是别人,如果是后端的问题,自己的心态就是“烧高香”。

但实际情况是,系统可用性需要前端和后端共同努力,如果后端不可用,前端怎么提升都是没有效果的,所以我们需要改变自己的认识。如果发现接口有问题,第一时间帮助后端解决或者帮助定位,减少故障影响的时间,这也能提高前端的服务效率。美团对技术团队的要求是,提高监控和反馈的敏锐度。接下来,就涉及到端到端监控和降级的方案了。

端到端监控与降级

监控、报警的目的是为了快速的发现问题。如果定位到问题,第一时间不能靠人力进行解决,那么应该马上进行故障自动处理或者降级。

可控的一些降级的方案在上文中已经提到。对于前端的监控,我们使用了美团开源的CAT。CAT可以定义每个页面覆盖资源的情况,可以细分到省、系统、网络、运营商等维度,从而帮更快的发现劫持和篡改的情况,然后及时进行修复。

故障演练的必要性

在实际工作中,我们很多时候都缺少执行力。比如上文提到的故障处理的方法和方案,在实际工作中有没有效果,或者能不能为业务做出价值和贡献,都需要要打个问号。当然,如果这些事情都没有实践,也相当于“纸上谈兵”。所以,为了最终要达到目的,提高系统的可用性,就需要提高系统的检验标准,接下来就是要做故障演练。

比如,我们可以人为的让后端接口挂掉,看前端服务的表现;让静态资源挂掉,检查对服务有没有影响。现在,美团的静态资源托管服务上运行着近千个项目,如果挂掉的话,会造成无法想象的后果。在这种情况下,托管CDN之后并不意味着会带来一些很好的效果,实际上它也会带来很多无法想象、无法预知的问题。所以为了系统的稳定性保障,最终落地点就是故障演练。

保障动作标准流程

最后总结几点,帮助大家做系统可用性的Review,主要分为事前、事中、事后:

  1. 事前依赖流程与规范,包括代码规范、分支规范、测试规范、上线规范等。如果没有百分百的把握,不要上线。上线标准一定明确的,模棱两可的上线,大概率会出现问题。

  2. 事中依赖监控与降级,可以设计一些监控和降级的方案。对于不可降级的要做好事前的预案,同时也依赖于演练的频率。演练的次数多了,就可以通过熟练的操作,降低服务受影响的时间,间接提高服务的可用性。

  3. 事后依赖执行力,要做可落地的Case Study。很多同学都是在事后复盘的时,说这次没有做好,代码写错了,没有太注意,这是别人的问题等等,草草就结束了。但是对下次事故来说,并没有预防的动作和可落地的执行方案。这就要求执行力,也看解决问题的决心。

总结

最后总结,影响前端服务可用性,其实就是两件事:

  1. 流程规范的执行力
  2. 工程化完整程度

很多前端的同学并没有关注监控和报警的情况,大部分精力还是放在业务开发和功能覆盖上。但是,制定流程规范是工程师通用的能力,希望大家在自己所负责的业务系统中,可以设定更多的流程制度,帮助保障前端服务的可用性和稳定性。

除此之外,我们要多思考。比如认真思考一下,之前的工作存在什么潜在的问题。思考的频率如何,思考之后的结果和落地的执行力如何,这些都非常重要。

我们发现很多前端同学都把时间花在业务开发和功能覆盖上,对于自己的系统缺少完整性的认知。所以建议大家可以先做一个通用的解决方案,覆盖从前端到后台,从研发、测试、上线的全流程。目前,美团金融前端团队已经开始尝试构建一个符合公司前端标准研发体系的解决方案,还有一个线上协作研发平台,将集团的服务进行集成,同时把很多平常不注意的事情集中进行解决,减少重复性的工作,帮助大家把精力更多地投入在核心业务层面。

如果大家对我们所做的事情也有兴趣,想要和我们一起共建大前端团队的话,欢迎发送简历至 tianyang02@meituan.com

作者简介

田泱,2015年校招入职美团,先后参与过美团平台移动版多项垂直品类的前端研发工作,从0到1参与了智能支付应用层的前端建设工作,现负责美团金融服务平台前端基础服务研发团队。

转载于:https://my.oschina.net/meituantech/blog/1925867

【基于QT的调色板】是一个使用Qt框架开发的色彩选择工具,类似于Windows操作系统中常见的颜色选取器。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备,支持C++和QML语言。这个调色板功能提供了横竖两种渐变模式,用户可以方便地选取所需的颜色值。 在Qt中,调色板(QPalette)是一个关键的类,用于管理应用程序的视觉样式。QPalette包含了一系列的颜色角色,如背景色、前景色、文本色、高亮色等,这些颜色可以根据用户的系统设置或应用程序的需求进行定制。通过自定义QPalette,开发者可以创建具有独特视觉风格的应用程序。 该调色板功能可能使用了QColorDialog,这是一个标准的Qt对话框,允许用户选择颜色。QColorDialog提供了一种简单的方式来获取用户的颜色选择,通常包括一个调色板界面,用户可以通过滑动或点击来选择RGB、HSV或其他色彩模型中的颜色。 横渐变取色可能通过QGradient实现,QGradient允许开发者创建线性或径向的色彩渐变。线性渐变(QLinearGradient)沿直线从一个点到另一个点过渡颜色,而径向渐变(QRadialGradient)则以圆心为中心向外扩散颜色。在调色板中,用户可能可以通过滑动条或鼠标拖动来改变渐变的位置,从而选取不同位置的颜色。 竖渐变取色则可能是通过调整QGradient的方向来实现的,将原本水平的渐变方向改为垂直。这种设计可以提供另一种方式来探索颜色空间,使得选取颜色更为直观和便捷。 在【colorpanelhsb】这个文件名中,我们可以推测这是与HSB(色相、饱和度、亮度)色彩模型相关的代或资源。HSB模型是另一种常见且直观的颜色表示方式,与RGB或CMYK模型不同,它以人的感知为基础,更容易理解。在这个调色板中,用户可能可以通过调整H、S、B三个参数来选取所需的颜色。 基于QT的调色板是一个利用Qt框架和其提供的色彩管理工具,如QPalette、QColorDialog、QGradient等,构建的交互式颜色选择组件。它不仅提供了横竖渐变的色彩选取方式,还可能支持HSB色彩模型,使得用户在开发图形用户界面时能更加灵活和精准地控制色彩。
标题基于Spring Boot的二手物品交易网站系统研究AI更换标题第1章引言阐述基于Spring Boot开发二手物品交易网站的研究背景、意义、现状及本文方法与创新点。1.1研究背景与意义介绍二手物品交易的市场需求和Spring Boot技术的适用性。1.2国内外研究现状概述当前二手物品交易网站的发展现状和趋势。1.3论文方法与创新点说明本文采用的研究方法和在系统设计中的创新之处。第2章相关理论与技术介绍开发二手物品交易网站所涉及的相关理论和关键技术。2.1Spring Boot框架解释Spring Boot的核心概念和主要特性。2.2数据库技术讨论适用的数据库技术及其在系统中的角色。2.3前端技术阐述与后端配合的前端技术及其在系统中的应用。第3章系统需求分析详细分析二手物品交易网站系统的功能需求和性能需求。3.1功能需求列举系统应实现的主要功能模块。3.2性能需求明确系统应满足的性能指标和安全性要求。第4章系统设计与实现具体描述基于Spring Boot的二手物品交易网站系统的设计和实现过程。4.1系统架构设计给出系统的整体架构设计和各模块间的交互方式。4.2数据库设计详细阐述数据库的结构设计和数据操作流程。4.3界面设计与实现介绍系统的界面设计和用户交互的实现细节。第5章系统测试与优化说明对系统进行测试的方法和性能优化的措施。5.1测试方法与步骤测试环境的搭建、测试数据的准备及测试流程。5.2测试结果分析对测试结果进行详细分析,验证系统是否满足需求。5.3性能优化措施提出针对系统性能瓶颈的优化建议和实施方案。第6章结论与展望总结研究成果,并展望未来可能的研究方向和改进空间。6.1研究结论概括本文基于Spring Boot开发二手物品交易网站的主要发现和成果。6.2展望与改进讨论未来可能的系统改进方向和新的功能拓展。
1. 用户与权限管理模块 角色管理: 学生:查看个人住宿信息、提交报修申请、查看卫生检查结果、请假外出登记 宿管人员:分配宿舍床位、处理报修申请、记录卫生检查结果、登记晚归情况 管理员:维护楼栋与房间信息、管理用户账号、统计住宿数据、发布宿舍通知 用户操作: 登录认证:对接学校统一身份认证(模拟实现,用学号 / 工号作为账号),支持密重置 信息管理:学生完善个人信息(院系、专业、联系电话),管理员维护所有用户信息 权限控制:不同角色仅可见对应功能(如学生无法修改床位分配信息) 2. 宿舍信息管理模块 楼栋与房间管理: 楼栋信息:名称(如 "1 号宿舍楼")、层数、性别限制(男 / 女 / 混合)、管理员(宿管) 房间信息:房间号(如 "101")、户型(4 人间 / 6 人间)、床位数量、已住人数、可用状态 设施信息:记录房间内设施(如空调、热水器、桌椅)的配置与完好状态 床位管理: 床位编号:为每个床位设置唯一编号(如 "101-1" 表示 101 房间 1 号床) 状态标记:标记床位为 "空闲 / 已分配 / 维修中",支持批量查询空闲床位 历史记录:保存床位的分配变更记录(如从学生 A 调换到学生 B 的时间与原因) 3. 住宿分配与调整模块 住宿分配: 新生分配:管理员导入新生名单后,宿管可按专业集中、性别匹配等规则批量分配床位 手动分配:针对转专业、复学学生,宿管手动指定空闲床位并记录分配时间 分配结果公示:学生登录后可查看自己的宿舍信息(楼栋、房间号、床位号、室友列表) 调整管理: 调宿申请:学生提交调宿原因(如室友矛盾、身体原因),选择意向宿舍(需有空位) 审批流程:宿管审核申请,通过后执行床位调换,更新双方住宿信息 换宿记录:保存调宿历史(申请人、原床位、新床位、审批人、时间) 4. 报修与安全管理模块 报修管理: 报修提交:学生选择宿舍、设施类型(如 "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值