主頁 > 軟體設計 > 從Weex到Web,性能逆勢如何破局?

從Weex到Web,性能逆勢如何破局?

2020-12-17 11:26:43 軟體設計

簡介:雙11如絲般順滑的服務體驗背后,是技術團隊對性能優化不斷地探索嘗試、升級迭代,今年飛豬會場實作了主會場直出、重點會場秒開、整體會場體感優秀,飛豬前端技術太吾分享飛豬在前端性能優化上面臨的挑戰及優化方向,詳解在端側預渲染、SSR、SnapShot、SPA、資源和資料預快取及監控和診斷上的優化細節,

image.png

沒有最快,只有更快!在前端開發領域,性能是一個永恒的話題,它不僅僅代表著用戶體驗,更直接影響業務效果,業界就流傳著一個共識:頁面加載時長每增加1秒,用戶就流失10%,

與去年雙11相比,今年飛豬會場的最大區別是從Rax0.6 on Weex到Rax1.0 on Web,因為在上半年,基于開發成本、可維護性等一系列的考慮,我們將前端渲染引擎回歸到WebView,頁面打開在強網路環境和資源離線這兩種情況下,雖然加載體感幾乎一致,但Web首屏性能資料還有提升空間,且在Web端通用手段已用盡,需要重新探索優化方向,但專案組最終通過多職能協同,完成主會場直出、重點會場秒開、整體會場體感優秀,

今年雙11前端的目標之一就是,在性能方面,體感要超過Weex,資料也要超過Weex,

一 面臨的挑戰

為Follow阿里集團的主推方案,使用Rax1.0統一DSL,一碼多端支持H5、小程式和未來的Flutter,飛豬從618大促開始,就將會場渲染側全量切換到 Rax 1.0 Web 渲染,當時對于性能方面的優先級不是那么高,之后,性能優化專項重啟,開始著手進行Web方面的優化研究,力爭提升雙11的用戶體驗,

飛豬的會場模塊復雜,包括視頻、影片、多Tab、長串列;介面RT高,且服務端已無優化空間;旅行行業特點,頁面依賴定位資訊、用戶資訊,拖慢首屏時間,所以如何保證會場可以更快地呈現給用戶是個嚴峻的考驗,

與此同時,雙11專案組對性能方面提出一個近乎苛刻的目標:比日常會場性能提高25%,在前端優化手段日趨穩定的情況下,還要進行幾百毫秒的優化,只能進入深水區,

二 優化方向

面對這個目標,傳統意義的前端方面優化已經不足以支撐,于是我們聯合客戶端、服務端以及其他BU同學,進行了一場協同戰役,我們主要面向三個方向進行優化:

  • 一是,與客戶端團隊合作,進行預渲染、離線包、Data-Prefetch等手段的落地和優化,
  • 二是,順應Serverless大潮,重啟營銷域SSR方案,將原本端側的壓力轉移到服務端上去完成,
  • 三是,在兼顧資料的同時,兼顧用戶的體感,做了兩種Snapshot的方案(介面快取、HTML快取)以及SPA方案,

下圖展示了所有會場所使用的優化手段:


image.png


所有會場所使用的優化手段

  • 主會場:為了保證主會場的最佳體驗,使用客戶端提供的終極大招——預渲染,
  • 主要會場:對于首屏沒有異步模塊的場景,使用SSR配合Data-Prefetch,提升用戶可見頁面時間,
  • 全部會場:因為模塊基本沒有變化,全部會場使用HTML快取型別的Snapshot方案,用戶可以更快瀏覽該頁面,
  • 底部重要會場:采用介面快取型別的Snapshot方案,提升用戶瀏覽體驗,
  • 所有會場均通過統一渲染頁推送離線包和Data-Prefetch,
  • 為保證分會場分別運營和頁面之間切換的流暢性,底部Tab五頁面之間使用類SPA方案,使頁面切換起來無縫銜接,

整體優化思路分析從整個渲染流程分析觸發,針對每個節點進行細致的分析優化:

image.png

1 技術實施詳解:端側預渲染

如果不考慮可能帶來的Crash風險,這應該是提升最大的方案了,

在雙11大促的場景下,通過端控制開關,將下發的配置URL以“離屏”的方式初始化好容器并loadUrl,在上屏之前完成頁面的Rasterization(柵格化),當用戶點擊頁面入口時,客戶端會直接將“準備好的Webview”推到前臺展示,頁面FCP從1~2s直接降到100ms以下,形成幾乎無感的打開效果,

效果對比

1.gif


開啟預渲染

2.gif
未開啟預渲染

方案流程圖

在客戶端通過配置下發的方式初始化WebView,并通過記憶體管控保證APP的穩定性,同時在展示邏輯上和前端配合,保證資料的一致性,最終通過釋放后續的一系列處理管理多次訪問的情況,

image.png

2 技術實施詳解:SSR(Server-side render or Serverless-side render)

披荊斬棘的戰士,帶著榮光歸來,

SSR中文名:服務端渲染,是將渲染的作業放在服務端進行,在 Ajax出現之前全部是這種方式,由服務端回傳給瀏覽器完整的 HTML 內容,在傳統BFF架構時期,這種方式逐漸消失,但借著Serverless大潮,當Faas遇上SSR,又迸發出新的火花,

今年3月,狼叔在《前端新思路:組件即函式和Serverless SSR實踐》中,將SSR的概念升級,從傳統意義上的Server-side render 升級為 Serverless side render,基于FaaS環境,提供端側頁面渲染能力,

專案組通過兩個月的調研和開發除錯,在國慶大促一個會場預演,在雙11的五個重點會場使用SSR,使機票會場性能提升50%,首屏可見時間減少1000ms+,

效果描述

SSR代表首屏即可視,相比CSR減少模塊加載以及頁面渲染,將可視時間大幅提前,

方案流程圖

整體方案保證性能優勢以及改造成本小的前提,采取異步SSR方案,即將HTML放在介面中回傳,在規避高低端機容器影響的同時,又可同時復用客戶端的離線以及資料預加載能力,還保證CSR到SSR的平滑切換,

image.png

3 技術實施詳解:SnapShot(頁面快照)

將用戶體感頁面可見時間繼續提前,

最初設計SnapShot是在非千人千面的場景下,多次訪問,更快的可見頁面,原理是將上一次訪問的 HTML 直接快取在本地,用戶下一次進入頁面時,首先展示快取的頁面,但后來發現,在雙11會場這種幾乎每天都會變陣的場景下,模塊的刪減以及順序的調整,都會使得從“快取頁面”到“真實頁面”的程序中發生不可避免的閃動,而這種閃動是難以接受的,于是我們重新設計出介面快取的方式,配合模塊快取,實作與之前效果相同,但避免閃動的方案,

同時,我們發現 HTML 快取的方式也并非毫無用武之地,雙11會場上線前,針對所有會場進行 Review 優化手段,發現在全部會場場景下,會場基本無變化,使用HTML快取的方式簡直再合適不過,于是我們將使用Snapshot 的頁面分為兩類,達到所有頁面都快且完美地呈現給用戶,

效果描述
開啟Snapshot后,整體頁面無Loading,基本達到頁面的直出效果,

4 技術實施詳解:SPA

完成用戶體感的“最后一公里”,多頁面間跳轉實作無感知,

各分會場需要進行分別運營,通過底部Tab包框將多頁面聚合,展示成一個頁面,通過點擊Tab進行切換,但頁面之間的跳轉造成的割裂體感一直被詬病,本次升級完成了類SPA的方案,將Tab中的頁面資料請求后,直接渲染成真實的Dom,切換通過Display的方式,基本在高端機上實作了將多頁面聚合成單頁面,多頁面間跳轉無感知,給予用戶最好的體驗,

效果描述

從多頁面之前的replace操作,頁面跳轉中出現白屏,到目前頁面中DOM的替換,用戶體感大幅提升,也取消了用戶點擊Tab卻跳頁面割裂的感覺,

方案流程圖

搭建頁面框架共用一套渲染引擎,且每個頁面的所有模塊通過Fetch獲取,每個模塊獨立發布,且支持模塊拆combo后單獨快取,非常適合SPA方案,同時專案組針對高低端機做了不同處理,在高端機上請求單Tab資料完成后,預加載其他幾個Tab資料,切換時直接取用,提供更好的體驗,

image.png

5 技術實施詳解:資源&資料預快取

最快的請求是不發請求,

利用飛豬端側的Fcache/DataPrefetch機制,結合總控配置下發通道,將頁面內的靜態資源主動下發到客戶端進行快取,使用戶訪問頁面時無需請求靜態資源,此外,在頁面發起跳轉時,在端側提前觸發頁面的資料請求,減少介面請求等待時間,

Fcache方案 (資源快取)

image.png

DataPrefetch方案 (資料預加載)
資料預加載擁有三個狀態:Memory、Ongoing、Miss,我們認為將請求放在客戶端發出一定會減少真實的請求時間,所以即使真實請求發出時,客戶端還未完成請求,只要key匹配,會等待客戶端資料,而不是重新進行一次請求發送,

image.png

6 技術實施詳解:監控&診斷

優化手段之余,也需要對會場頁面的性能趨勢進行持續監控,對于例外Case進行排查,為此,我們開發了實時的性能穩定性實時大盤、雙11會場小時級性能大盤平臺、耗時例外長的慢會話跟蹤小工具,

image.png

性能穩定性實時大盤

三 成果

飛豬端內雙11所有會場首屏可見時間達成既定目標,較日常會場首屏耗時環比降低 25%,較618以及國慶會場首屏耗時環比降低 20%,

image.png

雙11分組整體性能耗時趨勢圖

命中SSR的情況下首屏可見時間更是被拉入1s內,開啟SSR的會場在使用 Web后也可以重提秒開率,在業務頻繁變陣影響首屏模塊的基礎上,達到周整體秒開率 60%以上,機票會場秒開率75% 以上,

四 技術規劃

本次技術上有著很多新嘗試和迭代升級,在經過雙11的磨練之后,需要朝著更加易用和通用的方向發展,主要分為以下幾個部分:

1 SSR方案優化

SSR在端內提供了巨大提升,首先需要完善同步方案,實作端外場景的提升,其次,在現有基礎上增加AbTest,來支持更有說服力的業務效果對比;最后優化SSR在服務端的執行速度以及彈性擴容能力,

2 客戶端優化

接下來會嘗試多Webview的Tab切換,接入PHA方案,并將更多的喚端情況列入優化方向,如冷啟動場景的專項優化,

3 配套設施

優化的背后離不開配套設施的支持,在現有基礎上支持卡口、巡檢、監控等功能,實作性能問題及時治理,

五 總結

作為一位前端開發工程師,擔任雙11會場性能PM,特別是對于今年從Weex到Web,性能水位重新被拉高,是挑戰也是機會,

在保障業務不受影響的前提下,確保用戶打開會場可以得到更快體驗,從頁面各階段的耗時分析,到借助兄弟團隊能力,最終支撐雙11會場圓滿結束,

優化思路從整個渲染流程出發,秉承著快取優先、壓力轉移、階段并行、端側深挖、體感優化五項原則,對各節點應用不同手段達成最終結果,

在整個程序中,通過應用大量的優化手段和創新方案,提高用戶的秒開率來側面幫助業務轉化提升;將預渲染、SSR逐漸落入更多場景,為之后的全面性能提升做鋪墊;聯合客戶端、服務端,打破前端能力和邊界,進而探索性能深水區;提升性能資料提升的同時,兼顧性能資料監控,實時把控例外情況,

這種種優化手段肯定還不夠,之后首先會從單業務場景推廣到多業務場景,從單容器到多容器兼容,各業務、容器間進行方案的落地與反哺,最終期望可以完成全端性能標準統一,

最后,為明年雙11立個Flag:明年不再需要性能保障,而是在頁面生產出來的時候,就是滿足性能標準的!

原文鏈接:https://developer.aliyun.com/article/780011?

著作權宣告:本文內容由阿里云實名注冊用戶自發貢獻,著作權歸原作者所有,阿里云開發者社區不擁有其著作權,亦不承擔相應法律責任,具體規則請查看《阿里云開發者社區用戶服務協議》和《阿里云開發者社區知識產權保護指引》,如果您發現本社區中有涉嫌抄襲的內容,填寫侵權投訴表單進行舉報,一經查實,本社區將立刻洗掉涉嫌侵權內容,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/236056.html

標籤:其他

上一篇:react路由嵌套路由及路由傳參

下一篇:軟體架構設計的七大原則你知道嘛!!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more