iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 29
0
Software Development

今晚我想來點 Express 佐 MVC 分層架構系列 第 29

[今晚我想來點 Express 佐 MVC 分層架構] DAY 29 - node.js 與線程 (下)

上一篇提到有工具可以做到叢集 (Cluster) 的功能,以使用多線程,今天就要來簡單介紹一下這個強大的工具 - PM2

PM2 是什麼?

https://raw.githubusercontent.com/Unitech/pm2/development/pres/pm2-v4.png
聽到 PM 不要害怕,這是 Process Manager 的意思,它能夠很輕易地開啟多線程執行 node.js 應用,不僅如此,它可以讓應用程式永遠在背景執行,甚至可以不停機更新,簡直是神器呀!

安裝 PM2

透過 npm 進行全域安裝:

npm install -g pm2

簡單使用 PM2

以往我們要啟動 node.js 應用都是透過 node <檔案名稱> 指令,現在則改成使用 PM2 的指令,不過 PM2 提供的功能蠻多的,這邊就提一些比較基礎的功能來說明:

啟動

下方為透過 PM2 啟動前面做的 TodoList 指令:

pm2 start ./dist/main.bundle.js

可以看到下方為啟動成功的結果,這時候已經在背景運行了:
https://ithelp.ithome.com.tw/upload/images/20200922/20119338GNBXS7fd7i.png

可以透過 Postman 打 API 試試:
https://ithelp.ithome.com.tw/upload/images/20200922/20119338RLwI5DWGMO.png

移除

如果今天不想要運行應用了怎麼辦?非常簡單,下方為移除指令:

pm2 delete ./dist/main.bundle.js

可以看到 PM2 的清單中沒有東西了:
https://ithelp.ithome.com.tw/upload/images/20200922/20119338bcu7gv33Hi.png

命名與多線程啟動

前面的啟動方法是用檔案名稱做為 PM2 管理程序的名稱,假如一台 Server 管理很多個應用的時候,很容易忘記哪個是哪個應用,所以 PM2 有提供命名的方法。另外還有最重要的多線程執行,透過參數 -i <數量> 即可用 Cluster 的概念運行多線程:

pm2 start ./dist/main.bundle.js -i 4 --name todolist

可以看到列表上有 4 個名為 todolist 的程序,並且 mode 為 cluster:
https://ithelp.ithome.com.tw/upload/images/20200922/20119338WzWQVmA8Td.png

查看列表

雖然在啟動的時候 PM2 會顯示當下的程序列表,但日後想要查看要怎麼做呢?指令也是相當簡單:

pm2 list

重啟

要重啟在 PM2 中運行的應用只需要下指令即可,不需要重新啟動:

pm2 restart todolist

效能測試

來看看多線程與單線程的差異有多少吧!先安裝 loadtest 進行測試,它是一個用來壓力測試的套件,能夠在瞬間發出大量 Request。安裝方式一樣透過 npm 進行:

npm install loadtest -g

快速上手 loadtest

簡單介紹一下我們會用到的 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 有程序的話可以先將它們關閉再進行,並確認啟動的應用為最新

下圖為單線程的結果:
https://ithelp.ithome.com.tw/upload/images/20200923/20119338tE0jiDmEX8.png

總花費時間約 5 秒。

下圖為多線程的結果:
https://ithelp.ithome.com.tw/upload/images/20200923/20119338ncLWyQNfMP.png

總花費時間約 4 秒。

可以看到單線程與多線程之間的效能是有落差的,測試 TodoList 算是比較不明顯的比較,但依然能看出差異,若是用在更大更複雜的系統,那可就差很多了!

小結

用 PM2 可以快速建置多線程的應用,省下許多自己配置 Cluster 的時間,不過有一點要特別注意,在 Cluster 下的記憶體是不共用的,這在有些場景是會發生問題,比如說:passport 使用動態策略命名。下一篇就是這系列的最後一篇了,將會總結這一個月以來的內容,謝謝大家!


上一篇
[今晚我想來點 Express 佐 MVC 分層架構] DAY 28 - node.js 與線程 (上)
下一篇
[今晚我想來點 Express 佐 MVC 分層架構] DAY 30 - 是結束,也是開始
系列文
今晚我想來點 Express 佐 MVC 分層架構30

尚未有邦友留言

立即登入留言