前段時間客戶端這邊作了一個爆款活動,我這邊支持了一下h5頁面,也是我作了這麼久的web頁面以後第一次嘗試作移動端和使用jsbridge,同時由於咱們的服務有使用nodejs踩了一些坑,在這裏記錄一下。css
這裏只記錄了幾個開發的時候沒有注意到的坑html
因爲一開始UI給的prd裏的字體不是瀏覽器自帶的字體,所以我這邊使用了默認字體,沒有特地的添加font-family
屬性,後來在實際頁面中發現文字都變成了帶襯線的字體了,被UI提醒了一下才改爲了Helvetica
字體。前端
而且iOS的字體庫和Android的字體庫不一樣,在Android下能夠正常訪問的字體可能由於在iOS中不存在而命中黑體,所以要在全局設置font-family
node
font-family: "Helvetica Neue", Helvetica, STHeiTi, sans-serif;
複製代碼
爲了爲了優化頁面體驗,咱們在頁面中應該禁止用戶長按連接和圖片彈出菜單的功能,以及禁用選中文本功能。web
a, img {
-webkit-touch-callout: none; /* 禁止長按連接與圖片彈出菜單 */
}
html, body {
-webkit-user-select: none;
user-select: none;-webkit-touch-callout: none;
}
複製代碼
這裏咱們使用的hotcss
這個庫,一開始按照正常的rem開發去作,後來發現大小一直不對,最終從頭排查了一遍,發現是hotcss
計算出的dpr是3而不是1,致使meta
標籤最後是這個樣子的:chrome
<meta name="viewport" content="width=device-width, initial-scale=0.3333333333333333, minimum-scale=0.3333333333333333, maximum-scale=0.3333333333333333, user-scalable=no">
複製代碼
所以正常的計算出來的rem還要除3,如hotcss
計算出的font-size
爲67.5px
,dpr
爲1/3
,則最終的單位應該爲$px/22.5 + rem
。docker
移動端的性能較web來講要差不少,所以要作不少的優化後端
localStorage
中。-webkit-text-size-adjust: none;
node層具體功能:瀏覽器
- 服務端渲染頁面
- 轉發前端請求,本次活動頁面的代碼存放在主站的倉庫中,因爲主站的域名不在客戶端那邊的白名單中(不是主站的客戶端,另外一個產品),所以須要node進行一次請求轉發。
之前咱們作壓測都是對後端接口進行壓測,此次因爲使用了node進行SSR,而且node還有接口轉發,所以還須要對node進行壓力測試,這也是咱們團隊第一次對node進行壓測。緩存
指標:
本次活動對node層的要求是:SSR接口承載10000qps,轉發請求接口承載100000qps。這兩個數字其實都是峯值qps,也就是活動結束開獎那一刻的qps,平時qps很低,估計不到100。雖然感受QA同窗對峯值qps的估值也有點離譜,可是既然定了這個目標,咱們就須要努力達成。
因爲咱們申請的實例是雙核的CPU,所以首先想到的是使用pm2的cluster模式充分利用多核機器的優點。
踩坑:pm2裏面有一個參數是-i
,表示要開啓的進程數量,通常是開啓和CPU數量相同的進程數量。-i max
的意思是開啓和當前核心數目相同的進程數目。天真的我就這麼幹了,後來發現咱們的docker是運行在物理機上面的,物理機有60+的核心,使用max
以後,pm2直接去讀取物理機的核心數目並開啓進程……一下就開了60多個進程,而後服務就崩潰了。
因爲後端機器數量不足,沒法承載10wqps,所以須要前端這邊作一些打散和緩存的策略。
活動頁面一開始要求儘量快,所以咱們這邊直接採用了服務端渲染,後來壓測的時候發現,因爲開啓了SSR,一臺實例可以承載的qps從3000直接下降到200,可是又不能不使用ssr,由於國外一些地區網速可能會很慢,若是純粹使用客戶端渲染的話,可能頁面的加載時間會很長。
所以只能在ssr部分進行優化。
咱們第一時間想到的仍是利用內存,由於qps很高的時候基本集中在開獎的瞬間,而且這個瞬間的頁面是固定的,所以能夠直接在node中緩存開獎頁面的html字符串。
當第一個用戶拿到中獎信息以後,node緩存該次請求生成的html字符串,此後全部的請求都直接從內存中拿這個字符串使用就能夠了。
開獎以前的頁面本來是不打算作優化的,由於每一個用戶的信息都不同,若是放到內存那種的話可能會形成內存泄露,可是又怕有站內的大V宣傳次活動致使qps忽然增高,若是由於這種緣由致使服務器宕機的話就有點丟人了,因此最後仍是絕對對開獎以前的活動頁面也作一下緩存。
因爲頁面關於用戶信息的部分只有用戶名和倒計時剩餘時間的不一樣,所以咱們在node中緩存一個沒有用戶名和倒計時時間的公共字符串,而後請求到數據以後使用正則,將模板字符串中的用戶名和倒計時的佔位符替換掉便可。
性能不夠,機器來湊。
上面說了那麼多,都沒有加機器管用。
咱們爲了支持活動,將4臺實例擴容到了150臺。用戶儘管訪問,能宕機算我輸。