上一篇提到有工具可以做到叢集 (Cluster) 的功能,以使用多線程,今天就要來簡單介紹一下這個強大的工具 - PM2。
聽到 PM 不要害怕,這是 Process Manager 的意思,它能夠很輕易地開啟多線程執行 node.js 應用,不僅如此,它可以讓應用程式永遠在背景執行,甚至可以不停機更新,簡直是神器呀!
透過 npm 進行全域安裝:
npm install -g pm2
以往我們要啟動 node.js 應用都是透過 node <檔案名稱>
指令,現在則改成使用 PM2 的指令,不過 PM2 提供的功能蠻多的,這邊就提一些比較基礎的功能來說明:
下方為透過 PM2 啟動前面做的 TodoList 指令:
pm2 start ./dist/main.bundle.js
可以看到下方為啟動成功的結果,這時候已經在背景運行了:
可以透過 Postman 打 API 試試:
如果今天不想要運行應用了怎麼辦?非常簡單,下方為移除指令:
pm2 delete ./dist/main.bundle.js
可以看到 PM2 的清單中沒有東西了:
前面的啟動方法是用檔案名稱做為 PM2 管理程序的名稱,假如一台 Server 管理很多個應用的時候,很容易忘記哪個是哪個應用,所以 PM2 有提供命名的方法。另外還有最重要的多線程執行,透過參數 -i <數量>
即可用 Cluster 的概念運行多線程:
pm2 start ./dist/main.bundle.js -i 4 --name todolist
可以看到列表上有 4 個名為 todolist 的程序,並且 mode 為 cluster:
雖然在啟動的時候 PM2 會顯示當下的程序列表,但日後想要查看要怎麼做呢?指令也是相當簡單:
pm2 list
要重啟在 PM2 中運行的應用只需要下指令即可,不需要重新啟動:
pm2 restart todolist
來看看多線程與單線程的差異有多少吧!先安裝 loadtest 進行測試,它是一個用來壓力測試的套件,能夠在瞬間發出大量 Request。安裝方式一樣透過 npm 進行:
npm install loadtest -g
簡單介紹一下我們會用到的 loadtest 參數:
-c
:設置同時併發最大數量-n
:設置最大 Request 數量-H
:設置 Headers,可以將 Authorization 的 token 放在這裡我們使用下方指令針對 GET https://localhost:8080/api/todos 進行測試,由於此 API 需要 JWT 授權,所以請先打登入或註冊的 API 取得 JWT,並將下方 <token>
替換成 JWT:
loadtest -n 500 -c 100 -H "Authorization: Bearer <token>" http://localhost:8080/api/todos
測試單線程時,若 PM2 有程序的話可以先將它們關閉再進行,並確認啟動的應用為最新
下圖為單線程的結果:
總花費時間約 5 秒。
下圖為多線程的結果:
總花費時間約 4 秒。
可以看到單線程與多線程之間的效能是有落差的,測試 TodoList 算是比較不明顯的比較,但依然能看出差異,若是用在更大更複雜的系統,那可就差很多了!
用 PM2 可以快速建置多線程的應用,省下許多自己配置 Cluster 的時間,不過有一點要特別注意,在 Cluster 下的記憶體是不共用的,這在有些場景是會發生問題,比如說:passport 使用動態策略命名。下一篇就是這系列的最後一篇了,將會總結這一個月以來的內容,謝謝大家!