服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

干货 | 秒开率70%+,携程金融SSR应用性能监测与优化

日期: 来源:携程技术收集编辑:建成

作者简介

 

建成,携程高级前端开发,对前端工程化、性能优化、效率提升等方面有浓厚兴趣。



背景


对于一款互联网产品来说,用户体验始终扮演着重要的角色,尤其是在后互联网时代,增量见顶,竞争方向逐渐转为存量用户,体验的好坏可能直接决定着一个用户的去留。


据统计,网页加载时间从 1 秒增加到 3 秒,跳出率就会提高 32%;如果网页加载时间从 1 秒增加到 6 秒,跳出率就会上升 106%。


基于此,携程金融前端团队对内部SSR应用的性能实施了一系列的治理,本文将从性能监测、数据处理与分析、优化之路等方面来分享。


一、性能


用户体验是一个比较感性的概念,每个人的感受可能都不太一样,较难进行衡量。基于此,我们首先要把用户体验进行量化,使其可衡量和监测。


根据业内经验和相关分析,用户体验和页面首屏时间、页面累积布局偏移量有较强相关性,通过计算和监测这两个指标可以来衡量应用的用户体验。


二、性能监测


从技术方面来讲,前端性能监控主要有两种方式,一种是合成监控(Synthetic Monitoring,SYN),另一种是真实用户监控(Real User Monitoring,RUM)。


为了凸显用户真实的体验,我们采用了真实用户监控(即通过用户实际操作产生的一系列性能指标数据进行监测)。


2.1 页面首屏时间


页面首屏时间主要涉及到浏览器请求和渲染流程。


2.1.1 性能指标选定


为了能监测应用全链路性能表现,我们在整个链路中选取了最重要的几个节点,分别如下:



  • DNSDuration:衡量DNS时长

  • TCPDuration:衡量TCP链接时长

  • TTFBDuration:衡量浏览器接受到第一个字节的时长

  • RequestDuration:衡量SSR服务端处理时长

  • FCP:衡量携程端首屏时间

  • DOMContentLoaded:衡量去哪儿和携程金融app首屏时间(native loading隐藏时间点)

  • Load:衡量所有资源加载并执行时长


2.1.2 最佳表现(P90)


  • RequestDuration:300ms
  • FCP:800ms
  • DOMContentLoaded:1000ms


2.1.3 性能指标的收集


指标的收集会用到两个api,分别为监测Android的PerformanceObserver和监测iOS的 Performance.timing



// 创建性能监测实例function createPerformanceObserver(callback) {    // Create the performance observer    const po = new window.PerformanceObserver(list => {        callback && callback(list)    })
return po}
// 性能监测处理函数function performationAduitCallback(list) { for (const entry of list.getEntries()) { if (entry.entryType === 'navigation') { // navigation const DNSDuration = entry.domainLookupEnd - entry.domainLookupStart const TCPDuration = entry.connectEnd - entry.connectStart const RequestDuration = entry.responseEnd - entry.requestStart const TTFBDuration = entry.responseStart - entry.startTime const DOMCompleteDuration = entry.domContentLoadedEventEnd - entry.startTime              const DOMLoadDuration = entry.duration
// FCP let FCPDuration = 0; if (performance && performance.timing) { FCPDuration = window.headReadyTime ? window.headReadyTime - performance.timing.navigationStart : 0;              }
const performanceParams = Object.assign({}, extraInfo, { DNSDuration, TCPDuration, RequestDuration, TTFBDuration, FCPDuration, DOMCompleteDuration, DOMLoadDuration,              })
sendPerformance(performanceParams) } }}
// 性能指标监测(安卓)function performationAduitAndroid() { try { const PO = createPerformanceObserver(performationAduitCallback)
PO.observe({ entryTypes: ['navigation'], }) } catch (e) { console.log('performationAduitAndroid error', e) }}



// 性能指标监测(IOS)function performationAduitIos() {  const timing = performance && performance.timing  if (!timing) {      return  }
const start = timing.navigationStart const param = util.merge( {}, { DNSDuration: timing.domainLookupEnd - timing.domainLookupStart, TCPDuration: timing.connectEnd - timing.connectStart, RequestDuration: timing.responseEnd - timing.requestStart, TTFBDuration: timing.responseStart - start, FCPDuration: window.headReadyTime ? window.headReadyTime - start : 0, DOMCompleteDuration: timing.domContentLoadedEventEnd - start, DOMLoadDuration: timing.loadEventEnd - start, }  )
const performanceParams = Object.assign({}, extraInfo, param) sendPerformance(performanceParams)}


2.2 页面累积布局偏移量(CLS)


CLS (Cumulative Layout Shift) 是Web Vitals指标之一,主要用于测量整个页面生命周期中,布局移位的分值,以此衡量视觉稳定性。


2.2.1 性能指标的选定


衡量页面累积布局偏移量的指标只有一个,就是CLS。通过减少CLS,可以减少用户因为页面突然移位造成的误触概率。


2.2.2 最佳表现(P90)


  • CLS:0.05


2.2.3 性能指标的收集


CLS的收集同样使用 PerformanceObserver 这个api,这个api会有兼容性问题,只能应用于Android。


// 创建性能监测实例function createPerformanceObserver(callback) {    // Create the performance observer    const po = new window.PerformanceObserver(list => {        callback && callback(list)    })
return po}
// CLS处理函数function clsAduitCallback(list) { for (const entry of list.getEntries()) { if (entry.entryType === 'layout-shift') { // CLS const CLS = entry.value ? entry.value * 1000 : 0 const CLSParams = Object.assign({}, extraInfo, { CLS }) sendPerformance(CLSParams) } }}
// CLS数据指标(安卓)function clsAduit() { try {        const clsPO = createPerformanceObserver(clsAduitCallback)
if (window.PerformanceObserver.supportedEntryTypes.includes('layout-shift')) { clsPO.observe({ type: 'layout-shift', buffered: true, })        }
window.addEventListener('load', () => { // 延迟1s取消监听 setTimeout(() => { clsPO.disconnect() }, 1000) }) } catch (e) { console.log('cls error===>', e) }}


三、数据处理与分析

数据收集好之后,还需要对数据进行加工处理,才能客观的反应出应用的性能状况。加工处理的方式如下:


3.1 百分位数


在数据分析中,我们通常想衡量大部分用户的性能表现,而所有统计的数据中会存在一些异常的数据,因此需要对原始数据取百分位数进行分析。目前金融内部会取P50和P90两个百分位数进行分析。


3.2 分端统计


金融大部分应用主要运行在携程端、携程金融端和去哪儿端,为了衡量各端的性能情况,我们将数据进行了分段统计。


3.3 秒开率统计


页面首屏时间能反映出大部分用户的性能表现;秒开率能反应出性能最佳表现的用户所占比例。通过这两个数据基本上能衡量出我们应用的性能状况。


秒开率计算方法 = count(固定时间段内页面首屏时间 < 1s) / count(*)


四、优化之路


通过上面的数据处理和分析,已经能准确了解到应用的整体性能表现以及各阶段性能情况,下面就有针对性地对各阶段进行优化处理。


4.1 DNSDuration


  • 选择性的使用DNS Prefetch


隐式 DNS Prefetch:浏览器会对页面中和当前域名不在同一个域的域名进行prefetch。因此显式DNS Prefetch应用于页面中未出现的域名。所以二级页面中的域名如果在首页中没有出现,可以选择使用DNS Prefetch。


4.2 TCPDuration


前端的能力很难对TCP连接阶段进行优化,但是可以利用TCP的一些特点,进行资源获取的优化。


  • 首页的html size小于14k


由于TCP Slow Start的原因,我们应尽可能的将首页的html size控制在14k以内,使首页数据可以在一个TCP包中发送到浏览器,加快渲染速度。


  • Http1 → Http2减小TCP连接次数和减少渲染阻断


应用HTTP2多路复用和浏览器渲染流程。


4.3 RequestDuration


  • 优化服务端接口响应时长
  • 非必要接口放到客户端异步请求


4.4  FCP


  • CSS做内联


4.5 DCL


  • Preload提升阻塞JS下载优先级
  • 将webpack打包出的Bundle JS同步变异步(Async)
  • 减小JS Size:抽离公共chunk
  • 高效利用缓存:根据改动频率split chunk + ContentHash + 缓存


4.6 onload(页面完全展示)


  • 接口数据缓存:与用户关联度较小的接口
  • 图片转webp
  • 图片size控制
  • 字体preload


4.7 CLS


  • 尽可能可以不发生移位
  • 发生移位的位置尽可能影响更少的区域
  • 移位的距离尽可能小,且使用动画
  • 骨架图


五、总结


通过以上的治理步骤,金融主要SSR应用的秒开率都提升到了70%以上,且做到实时监控性能变化,一旦性能出现问题,可以及时感知并采取措施进行解决。


相信通过以上的努力,可以给金融所有的用户一个良好的用户体验,从而助力产品发展。


【推荐阅读】




 “携程技术”公众号

  分享,交流,成长


相关阅读

  • 干货 | 新时代的 SSR 框架破局者:qwik

  • 作者简介19组清风,携程资深前端开发工程师,负责商旅前端公共基础平台建设,关注NodeJs、研发效能领域。引言今天这篇文章中和大家聊一聊号称世界上第一个 O(1) 的 JavaScript SS
  • 一款直观查看手机性能排名软件,一目了然

  • 手机性能排行正式版 下载链接:https://pan.baidu.com/s/1B9zmxbt8xxSqDdWl3g0a2Q提取密码:zchn(长按复制链接粘贴到浏览器网址栏中打开)软件名称:手机性能排行软件版本:v4.5.9软件
  • 了解 Flutter 开发者们的 IDE 使用情况

  • 作者 / JaYoung Lee, UX Researcher at GoogleGoogle 的 Flutter 团队负责构建和维护 Android Studio (基于 IntelliJ-IDEA) 和 Visual Studio Code (VS Code) 的支持。我们
  • 阿里巴巴正式开源云原生应用脚手架

  • 12 月 3 日,微服务 x 容器开源开发者 Meetup 上海站上,阿里云智能技术专家,云原生应用脚手架项目负责人良名宣布阿里巴巴云原生应用脚手架项目正式开源,并在现场做了相关内容介
  • 创新者的窘境

  • 最近读了一本书,《创新者的窘境》,这本书讲的是一些非常领先的公司,也没有明显的失误。但是在竞争中就落后了,而且可能就此被淘汰了。这些企业遇到的问题大致可以分成两大类。一
  • 跨境机遇涌现,品牌出海正当时

  • 近几年,人们目睹电子商务渗透率在全球市场不断攀升,跨境电商行业经历了爆发式的增长。受全球疫情影响,“宅经济”开始搭台唱戏。电商平台快速取代线下消费场景,一跃成为消费者购
  • 红队视角下的Windows RPC

  • 更多安全资讯和分析文章请关注启明星辰ADLab微信公众号及官方网站(adlab.venustech.com.cn)0x00 前言本文将介绍Windows RPC服务,在红队(Red Team)视角下的一些利用方式,并不会产
  • 折叠屏市场翻倍增长,OPPO异军突起

  • 2023年中国经济快速复苏的确定性极高,知名投行普遍预测增幅在5%。春节期间,旅游出现井喷,春节后境外游也热火朝天。与此同时,作为消费风向标的高端手机市场也传来好消息。IDC数
  • Google Chrome 推出减少内存占用和耗电的工具

  • Google 去年底释出 Chrome 108 时宣布它将发布工具减少浏览器的内存占用和改进电池续航。刚刚释出的 Chrome 110 桌面版本开始向用户提供这两个工具 Energy Saver 和 Memory

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 携程Tech Girl:做勇敢的女孩

  • 在听到采访结束可能要拍照的消息时,小选眼睛一眨,狡黠地问到“会P图么?”,然后爆发出一阵爽朗的笑声,“你看,这就是女性的顾虑,有时候是无意识的”,她补充道。 小选三年前加入携程,目
  • 干货 | 携程动态表单DynamicForm的设计与实现

  • 作者简介 Daryl,携程高级研发经理,关注业界大前端及高并发应用解决方案。一、简介在很多软件系统中,表单开发都是很重要的一个部分。在表单开发中,往往会遇到重复开发的问题,例如
  • 干货 | Flutter在携程复杂业务的高性能之旅

  • 作者简介 本文为联合撰稿,作者为携程火车票Flutter团队,关注Flutter开发的效率、质量和新技术,致力于提升Flutter业务流畅度。一、背景 携程火车票在十余个核心业务的列
  • 干货 | 新时代的 SSR 框架破局者:qwik

  • 作者简介19组清风,携程资深前端开发工程师,负责商旅前端公共基础平台建设,关注NodeJs、研发效能领域。引言今天这篇文章中和大家聊一聊号称世界上第一个 O(1) 的 JavaScript SS