精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

蘇寧Nodejs性能優化實戰

開發 前端
自 2016 年以來,蘇寧大規模的使用了基于 Nodejs 渲染的項目,架構使用 Nginx+Nodejs+PM2 組合,其中 Nodejs 版本從最初的 6.0+ 升級到如今的 8.0+,Nodejs 框架從 Express 過度到 Koa2,而 Nodejs 的性能優化作為其中的核心,蘇寧在其性能提升上,也從 0 到 1,開始摸索。

 [[228719]]

Nodejs 項目背景介紹

自 2016 年以來,蘇寧大規模的使用了基于 Nodejs 渲染的項目,架構使用 Nginx+Nodejs+PM2 組合,其中 Nodejs 版本從最初的 6.0+ 升級到如今的 8.0+,Nodejs 框架從 Express 過度到 Koa2,而 Nodejs 的性能優化作為其中的核心,蘇寧在其性能提升上,也從 0 到 1,開始摸索。

初步優化—css、js 注冊與合并

ejs 模板相關優化

在蘇寧的 nodejs 項目中,剛開始使用 express 框架,后來隨著 node.js 8.0 LTS 版本的發布,又開始使用 kos 框架。無論是 express 還是 koa 框架,蘇寧在項目開發中都使用 ejs 模板語言(關于 ejs 模板語言這里就不多做介紹,有興趣的同學可以自行搜索)。

 合并 css 和 js 帶來的性能損失

在使用 ejs 模板過程中,蘇寧把公共部分抽出來為 layout.ejs 文件,頁面模板通過 ejs include 方法在 layout.ejs 引入,例如: 

  1. //layout.ejs 
  2. <link type="text/css" rel="stylesheet" href="public.css" /> 
  3. <script src="public.js"></script> 
  4. ... 
  5. include(page1); 
  6. ... 
  7.  
  8. //page1.ejs 
  9. <link type="text/css" rel="stylesheet" href="page1.css" /> 
  10. <script src="page1.js"></script> 
  11. <h1>hello</h1>  

這樣做解決了公共部分與頁面業務邏輯的分離,但是也帶來另一個問題 --layout 模板和 page1 模板中靜態資源標簽位置的問題,以下是渲染過后返回給客戶端的 html 頁面: 

  1. ... 
  2. <link type="text/css" rel="stylesheet" href="public.css" /> 
  3. <script src="public.js"></script> 
  4. </header> 
  5. <body> 
  6. <div class="header"></div> 
  7. <link type="text/css" rel="stylesheet" href="page1.css" /> 
  8. <script src="page1.js"></script> 
  9. <h1>hello</h1> 
  10. </body> 
  11. ...  

我們可以看到 page1 的靜態資源引用標簽都在 body 內,復雜的頁面可能還會有 page2、page3、pageN... 這樣會有大量的靜態資源引用標簽出現在 body 內,這顯然不符合我們的預期,我們需要控制靜態資源標簽在頁面中的調用位置,為了解決上面的問題,蘇寧引入了 ejs 模板靜態資源 register 機制,其注冊步驟如下:

a. 使用 getResource() 方法輸出占位符。

b. 使用 register() 注冊方法注冊資源,例如:register('a.css', 'b.js')。

c. 將注冊的靜態資源處理合并后進行字符串 replace 操作。

使用 register 方法后 ejs 模板渲染過后的 html 頁面如下: 

  1. ... 
  2. {{{CSS_PLACEHOLDER}}} 
  3. </header> 
  4. <body> 
  5. <div class="header"></div> 
  6. <h1>hello</h1> 
  7. </body> 
  8. {{{JS_PLACEHOLDER}}} 
  9. ... 

“{{{CSS_PLACEHOLDER}}}”和“{{{JS_PLACEHOLDER}}} ”就是getResource()輸出的占位符,在服務器response之前進行字符串replace操作,將占位符替換成register()方法中注冊的路徑: 

  1. ... 
  2. <link type="text/css" rel="stylesheet" href="public.css" /> 
  3. <link type="text/css" rel="stylesheet" href="page1.css" /> 
  4. </header> 
  5. <body> 
  6. <div class="header"></div> 
  7. <h1>hello</h1> 
  8. </body> 
  9. <script src="public.js"></script> 
  10. <script src="page1.js"></script> 
  11. ...  

這樣就符合了正常的頁面靜態資源引入位置,同時蘇寧在 register() 方法做路徑合并的功能,合并后的地址路徑如下: 

  1. … 
  2. <link type="text/css" rel="stylesheet" href="public.css,page1.css " /></header> 
  3. <body> 
  4. <div class="header"></div> 
  5. <h1>hello</h1> 
  6. </body> 
  7. <script src="public.js, page1.js "></script> 
  8. ...  

這樣瀏覽器中發起的請求就會少很多,減少頁面請求也是性能優化的一個點。

 緩存機制

使用 register 機制后我們又發現了一個問題,當客戶端每一個 request 請求發起,nodejs 服務在響應之前都會進行字符串查找替換, 如果頁面夠復雜,最終渲染生成的字符串足夠大,每一次進行字符串查找替換的過程中也造成了一定的性能損耗。正常在實際的使用中我們多次訪問一個路由地址,其頁面引用的靜態資源并不會發生變化。利用這個特性蘇寧引入了靜態資源緩存機制。

當一個新的頁面請求進來之后,在執行 register 方法之前,會根據頁面請求地址的 pathname 進行緩存查找,如果命中緩存,則 getResource() 直接返回緩存內容,相應的 regsiter 方法也不會去執行。否則執行 register() 流程。引入緩存機制后,非第一次訪問代碼邏輯中少了注冊、替換流程,相應的頁面響應時間也縮短了,經過多次測試,頁面響應時間大概縮短 4-8ms。

進階優化—大量路由的優化匹配

在開發蘇寧易購香港站過程當中,由于整站頁面較多、參數開發人員眾多及基于項目安全性的考慮,項目開發中配置了多達 173 條靜態路由以及 11 條動態路由,所以路由匹配效率明顯下降。究其原因,得從 express 源碼入手,express 框架在處理路由配置的方法是,將每一條配置信息轉換成一條正則表達式,在請求進入的時候,逐條進行匹配,直到匹配成功為止。

對于動態路由——路由中含有模糊匹配,則必須使用正則表達式來進行匹配,無法優化。而對于靜態路由,就是固定的字符串的路由表達式,則可以通過鍵值對映射進行匹配,復雜度從 O(n) 變成了 O(1) 大大縮短匹配時間,且不會隨著路由增加而耗時加長。在實際代碼中,由于架構采用了集中路由配置,所以很方便的從配置文件里面就篩選出了靜態路由,然后存放在一個 Object 中(HashMap)。然后形成一個中間件形式,相當于把多條路由中間件變成了一條路由中間件。

缺陷:和原來的邏輯相比,優化后的方案缺少了路由匹配的順序,所以在開發的時候需要額外注意,不過總體來說影響甚微,因為靜態路由優先匹配,也是應該優先響應的。

高階優化—TPS 的提升

在蘇寧易購大聚惠系統的前后端分離中,初次提交壓力測試結果非常差。懷疑有什么配置沒有配好,當時的數據是這樣的(16 臺 4C4G):

TPS 低的不能忍,而且當時已經配備了 Node.js 8.9.1 這個版本,理論上絕不可能那么差,在觀察代碼,也沒有發現特別消耗性能的地方。最后我們找到了原因,在 ejs 模版配置的時候沒有開啟模版緩存導致。如果不開啟模版緩存那么每次請求渲染的時候,都會從磁盤中讀取本地模版文件進行操作,這個磁盤讀取的動作消耗了很多 CPU。平時使用不會察覺,只有當壓力測試的時候才會體現出來。設置好了參數后,我們得到了 10 倍的性能提升。

但我們的優化并沒有止步于此,我們定的目標是 3000TPS,也就是還需要再提高 50% 的渲染性能。這時候我們就必須找到影響 nodejs 性能的點。Nodejs 的特點是單線程異步編程,意味著異步操作對性能的影響不大,而同步操作則會嚴重影響性能。

所以第一步,是先檢查代碼中同步操作的邏輯,是否有消耗 CPU 的代碼。經過檢查,排除了代碼部分的嫌疑。只好借助 chrome 提供的 devtools 來進行分析,啟動 node 參數—inspect,打開 chrome 的 devtools 插件就可以通過 CPU profile 進行分析了。排除掉不可避免的 CPU 消耗,問題浮出水面,原來還有一部分的 CPU 消耗來自于 ejs 模版引擎的內部。

從圖中可以看出來有兩部分消耗,一部分是來自 ejs 模版引擎內部的淺拷貝,一部分是來自查找文件是否存在的系統命令。由于大聚會系統的 ejs 里面大量使用 include,導致了這部分消耗凸顯了出來。打開 ejs 引擎源碼查看,發現雖然緩存了模版,但每次 include 函數依然會去執行 fs.exsitSync 函數。找到罪魁禍首以后,修改起來其實很簡單,在執行改函數的判斷條件里面加上先判斷緩存中是否存在。修改后這部分消耗減少了不少。

淺拷貝的問題,通過 js 的原型鏈解決,將傳入的數據對象作為原型對象,通過 Object.create 函數構造一個派生對象,實現原來淺拷貝達到的目的(模版內部修改對象屬性不會影響原始對象,防止污染原始對象傳入到其他模版中去)。派生對象修改屬性,并不會修改原型中對象的屬性,只會在派生對象中新建一個同名的屬性,所以不會污染原始對象。新增屬性也只會在派生對象中。這一步優化減少了很多賦值操作。

經過以上的優化,再進行 CPU profile 分析,發現在 ejs 引擎內部依然有一個函數在消耗 CPU,那就是 getIncludePath。這個函數的目的是在執行 include 的時候講傳入的相對路徑轉成絕對路徑,目的是防止嵌套的 include 中傳入相同的相對路徑字符串,卻是代表不同的模版文件。但是在轉換成絕對路徑這一步里面會調用文件系統函數造成 CPU 消耗。

解決的思路很快就出來了,就是需要講相對路徑映射成絕對路徑,然后緩存起來,這樣就不必每次去計算絕對路徑了。當然這個緩存不能是全局的,必須每一個 include 創建一個緩存,這樣才能避免相同的相對路徑有歧義的問題。

原始邏輯:

優化的邏輯:

說明:路徑映射 Map 是一個定義在模版函數所在作用域上的,只有該模版函數內部能訪問到,每次執行模版函數的時候都會擁有一個獨立的 Map。

經過上述優化后,本地進行壓測有 50% 的性能提升,故提交測試組對大聚會進行線上壓測。

壓測結果非常好,從 2000tps 到了 3500 多,提升了 75% 之多。單臺機器大約 220tps 左右,而原 java 系統單臺大概 150tps 左右。

 總  結  

Nodejs 系統的性能優勢主要體現在異步 IO 上面,所以性能瓶頸基本都是出在同步操作上面,那么優化也是主要盡量減少同步操作,適當使用一些 js 的技巧,另外 npm 包的開源特點也給優化工作帶來了便利。

 

責任編輯:龐桂玉 來源: 前端之巔
相關推薦

2018-11-13 08:00:14

蘇寧iOS開發

2013-02-20 10:07:29

蘇寧電器蘇寧云商云服務

2016-11-10 19:31:00

蘇寧雙11

2009-04-20 08:51:50

MySQL查詢優化數據庫

2017-03-29 14:44:20

網絡性能優化

2022-05-17 09:02:30

前端性能優化

2018-11-12 12:45:19

2013-10-31 09:49:07

2018-11-14 10:48:52

蘇寧管理系統服務性能

2019-12-13 10:25:08

Android性能優化啟動優化

2017-09-01 13:19:35

蘇寧無人店Biu

2013-10-29 10:41:06

SAP

2020-02-27 08:00:41

混沌工程系統失控條件

2020-06-19 07:00:00

蘇寧數字孿生平臺

2019-12-24 09:30:59

蘇寧高可用高并發

2014-02-19 10:40:07

虛擬運營商

2015-05-30 10:04:24

線下公開課51CTO沙龍MDSA

2017-08-21 09:03:43

2017-03-14 18:48:06

Android性能優化內存優化

2017-11-29 09:34:03

MVP蘇寧移動
點贊
收藏

51CTO技術棧公眾號

高清在线观看免费| 国产欧美 在线欧美| 亚洲乱妇老熟女爽到高潮的片 | 三级在线免费观看| 亚洲第一视频在线| 久久久久久久欧美精品| 久久久999成人| av无码一区二区三区| 本网站久久精品| 亚洲综合免费观看高清在线观看| 久久伊人一区二区| 99视频免费看| 天堂久久久久va久久久久| 精品久久久999| 成人免费看aa片| 亚洲午夜免费| 欧美三级在线看| 高清在线观看免费| 男女在线观看视频| 国产精品国产自产拍在线| 狠狠色综合网站久久久久久久| 亚洲一区二区视频在线播放| 99精品免费网| 欧美精品videossex88| 国产精品久久久久久久av| 久久黄色影视| 91精品国产欧美一区二区18| 日韩视频在线免费看| 国产精品186在线观看在线播放| 亚洲国产成人午夜在线一区| 精品国产免费久久久久久尖叫| 国产伦精品一区二区三区免.费 | 97超碰成人在线| 天堂在线中文网官网| 一区二区三区中文字幕在线观看| 深夜福利成人| 户外极限露出调教在线视频| av欧美精品.com| 成人欧美一区二区| 99精品国产99久久久久久97| 免费观看在线综合色| 国产不卡精品视男人的天堂 | 日本高清不卡aⅴ免费网站| 阿v天堂2018| 欧洲精品二区| 一区二区三区免费在线观看| 亚洲午夜精品久久久久久浪潮| 国产一级片在线| 久久色在线观看| 久久免费看av| 视频国产在线观看| 91小视频免费看| 国产视频在线观看一区| 日韩一级免费毛片| 成人av在线一区二区| 国产精品日韩欧美一区二区三区| 性中国xxx极品hd| 国产91在线观看丝袜| caoporn国产精品免费公开| av中文字幕免费在线观看| 国产一区二区精品久久99| 川上优av一区二区线观看| 97超视频在线观看| 国产在线观看一区二区| 亚洲a在线播放| 性中国xxx极品hd| caoporn国产精品| 久久精品国产美女| 国产综合视频一区二区三区免费| 中文字幕精品一区二区精品绿巨人| 日韩av电影免费播放| 最新97超碰在线| 亚洲人成精品久久久久久| 免费网站在线观看视频| 国产精品原创| 色系网站成人免费| 成 人 黄 色 小说网站 s色| 天堂va在线高清一区| 亚洲第一天堂无码专区| 特大黑人巨人吊xxxx| 欧美精品乱码| 另类专区欧美制服同性| 日韩 欧美 亚洲| 视频一区视频二区中文| 国产一区欧美二区三区| 亚洲精品国产av| 久久久三级国产网站| 亚洲精品乱码久久久久久蜜桃91| 成人直播在线| 欧美日韩中文字幕综合视频| 亚洲一区二区三区四区五区xx| 少妇高潮一区二区三区99| 日韩天堂在线观看| 成年人网站免费看| 国产精品久久久久久久久久10秀| 欧美激情视频一区二区三区不卡| 毛片视频网站在线观看| 看电视剧不卡顿的网站| 国产伦精品一区二区三区高清| 经典三级在线| 怡红院av一区二区三区| av片中文字幕| 亚洲一区电影| 中文字幕精品av| 久久精品欧美一区二区| 日韩avvvv在线播放| 国产精品麻豆免费版| freemovies性欧美| 婷婷六月综合亚洲| 一级日本黄色片| 国产探花一区| 国内久久久精品| 国产一区二区在线视频观看| 99re热视频这里只精品| 久久久久久久久影视| 欧美黑人疯狂性受xxxxx野外| 日韩一区二区影院| 调教驯服丰满美艳麻麻在线视频| 亚洲国产日韩欧美一区二区三区| 国产这里只有精品| 国产中文在线观看| 午夜久久久久久久久| 亚洲综合20p| 成人影视亚洲图片在线| 国产91精品久久久久久久| 国产熟女一区二区三区四区| 欧美激情综合在线| 无码人妻精品一区二区三区在线| 亚洲超碰在线观看| 久久精品亚洲国产| 黄色一区二区视频| 久久久99精品免费观看不卡| 免费一级特黄毛片| 视频在线亚洲| 欧美福利在线观看| 精品国产免费无码久久久| 国产精品人妖ts系列视频| 99福利在线观看| 欧美黄色网视频| 性欧美视频videos6一9| 国精产品乱码一区一区三区四区| 亚洲欧美视频在线观看视频| 九九精品久久久| 91免费精品| 国产精品午夜视频| 97电影在线看视频| 欧美在线视频日韩| 国产91丝袜美女在线播放| 久久久亚洲人| 日韩电影免费观看高清完整| 欧美暴力调教| 日韩性xxxx爱| 国产免费的av| 一区二区三区加勒比av| 韩国三级视频在线观看| 欧美黑人猛猛猛| 日本成人中文| 97人人做人人爱| 婷婷久久久久久| 精品日韩美女的视频高清 | 26uuu精品一区二区在线观看| 久久综合久久网| 林ゆな中文字幕一区二区| 2020欧美日韩在线视频| 日韩美女一级视频| 91久久精品国产91性色tv| 成人片黄网站色大片免费毛片| 久久人人精品| 尤物一区二区三区| 亚洲开心激情| 欧美一级大胆视频| 高清美女视频一区| 欧美久久免费观看| 激情小说中文字幕| 99久久精品国产一区| 少妇高清精品毛片在线视频 | 中文字幕在线中文| 18国产精品| 国产69精品久久久久久| 成年女人的天堂在线| 欧美精三区欧美精三区| 久久精品www人人爽人人| 成人福利视频在线看| 黄色a级片免费| 91九色精品| 久久99精品久久久久久久青青日本 | av男人一区| 秋霞av国产精品一区| 137大胆人体在线观看| 日韩欧美电影一区| 中文字幕精品视频在线观看| 亚洲视频免费观看| 一女三黑人理论片在线| 久久av中文字幕片| 免费看国产一级片| 国产精品久久久久久久久久10秀 | 青青久草在线| 欧美电影一区二区三区| 日韩精品一区二区av| 中文字幕国产一区二区| 97中文字幕在线观看| 视频一区视频二区中文| 日韩国产成人无码av毛片| 国产一区二区三区天码| 99re在线观看| 成人在线免费| 欧美一级片在线播放| av官网在线播放| 伊人精品在线观看| 日本激情一区二区| 91精品久久久久久久91蜜桃| 狠狠人妻久久久久久| 尤物在线观看一区| 国产主播av在线| 91伊人久久大香线蕉| www激情五月| 麻豆精品视频在线观看免费| 久久久久久久中文| 午夜日韩电影| 91手机视频在线| re久久精品视频| 蜜桃传媒一区二区| 国产精品高潮呻吟久久久久| 国产精品成人aaaaa网站| av影院在线| 久精品免费视频| 黄色网在线免费看| 中文字幕视频在线免费欧美日韩综合在线看 | 国产亚洲xxx| 日本午夜在线| 亚洲电影在线看| 人妻与黑人一区二区三区| 欧美一级在线观看| 91好色先生tv| 欧美日韩国产在线观看| 国产黄色免费视频| 色婷婷综合激情| 国产无套丰满白嫩对白| 精品久久久久久久久中文字幕| 免费视频一二三区| 亚洲码国产岛国毛片在线| 中文字幕观看av| 亚洲欧洲成人自拍| 亚洲国产精品一区二区久久hs| 日本一区二区三级电影在线观看 | 成人免费直播live| 久久69成人| 国产日韩在线视频| 色8久久久久| 成人免费网视频| 国产一区一区| av蓝导航精品导航| 一区二区三区免费在线看| 97人人做人人人难人人做| 亚洲日本一区二区三区在线| 操人视频欧美| 欧美黄色影院| 日韩欧美电影一区二区| 成人免费av| 婷婷视频在线播放| 欧洲一区二区三区| 国产网站一区二区三区| 久久午夜福利电影| 日本一区二区三级电影在线观看| 国产视频123区| 亚洲欧美一区二区三区极速播放| 免费一级片视频| 午夜精品福利在线| 无码人妻精品一区二区三区蜜桃91 | 欧美久久亚洲| 国产精品一级久久久| 日韩欧美在线精品| 亚洲午夜精品一区二区三区| 亚洲色图二区| 久久精品国产sm调教网站演员| 国产亚洲网站| 最新国产黄色网址| 高清国产一区二区三区| 巨胸大乳www视频免费观看| 国产喷白浆一区二区三区| 成人涩涩小片视频日本| 亚洲成精国产精品女| 精品久久久久久久久久久国产字幕| 欧美高清激情brazzers| 深夜福利视频网站| 国产视频欧美视频| 黄色网址在线免费| 热久久免费国产视频| 999精品嫩草久久久久久99| 国产91aaa| 日韩国产欧美| www.av蜜桃| 久久精品国产精品亚洲精品| 欧美xxxxx少妇| 国产精品久久免费看| 久久久精品国产sm调教网站| 色婷婷综合久久| 亚洲乱色熟女一区二区三区| 亚洲女人被黑人巨大进入| www在线视频| 国产成人91久久精品| 亚洲欧美日本国产| 亚洲色图自拍| 免费亚洲视频| 成年人性生活视频| 亚洲国产精品激情在线观看| 国产乱码久久久久久| 欧美日韩免费一区二区三区视频| 三级网站免费观看| 久久精品小视频| 四虎4545www精品视频| 国产精品视频免费观看| 午夜久久免费观看| 日本999视频| 99国产精品一区| 久久亚洲成人av| 6080yy午夜一二三区久久| 国产高清免费av在线| 91高清视频在线免费观看| 清纯唯美激情亚洲| 中文字幕在线亚洲三区| 久久一区国产| 成人免费无码大片a毛片| 一区二区三区四区视频精品免费 | 综合网中文字幕| 国内老司机av在线| 91九色偷拍| 91精品精品| 岛国毛片在线播放| 国产人成亚洲第一网站在线播放| 日韩成人高清视频| 精品国产成人系列| 毛片网站在线看| 99久久精品久久久久久ai换脸| 天天影视综合| 99热一区二区| 日韩一区欧美一区| 国产精品久久久久久久久久久久久久久久久久| 亚洲欧美国产一区二区三区| 美女露胸视频在线观看| 狠狠色综合一区二区| 日韩一级精品| 一起草在线视频| 韩曰欧美视频免费观看| 亚洲av成人精品日韩在线播放| 久久久久久久影院| 精品视频在线你懂得| 国产精品成人久久电影| 波多野结衣中文字幕一区 | 黄色在线播放网站| 亚洲a成v人在线观看| 中文字幕午夜精品一区二区三区| 91插插插影院| 亚洲综合成人在线| 天天操天天干天天爽| 97视频在线免费观看| 爽爽窝窝午夜精品一区二区| 国产精品亚洲a| 欧美激情一区二区三区全黄 | 黄页网站大全一区二区| 成人自拍小视频| 日韩精品一区二区三区在线观看| 日本片在线看| 精品无码久久久久久久动漫| 噜噜噜躁狠狠躁狠狠精品视频| 婷婷色一区二区三区| 欧美日韩一区二区三区四区五区| 欧美jizz18性欧美| 亚洲在线第一页| 亚洲经典视频在线观看| 亚洲av无码成人精品国产| 在线观看视频欧美| 成人直播在线| 久久婷婷国产综合尤物精品| 久久尤物视频| 91视频综合网| 日韩精品高清在线| 国产精品第一国产精品| 国产在线视频在线| 国产亚洲美州欧州综合国| 一级做a爱片久久毛片| 欧美丰满少妇xxxxx| 蜜桃国内精品久久久久软件9| 亚洲欧美日韩精品一区| 亚洲电影在线播放| h网站在线免费观看| 国产伦精品一区| 日韩av高清在线观看| 在线免费日韩av| 亚洲乱码一区av黑人高潮 | 美腿丝袜亚洲色图| 麻豆changesxxx国产| 亚洲人午夜精品| 日本综合精品一区| av免费在线播放网站| 夜夜嗨av一区二区三区网页| 国产一区电影| 精品一区二区国产| 国产专区综合网| 91视频久久久|