[今晚我想来点 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 使用动态策略命名。下一篇就是这系列的最後一篇了,将会总结这一个月以来的内容,谢谢大家!


<<:  第 30 天 - 总结

>>:  Day 29 部署 package

IOS Swift 如何让App读取网页

前言: 这次来讲如何在你的App内汇入网页,本次没什麽废话要讲,因为今天连续写两篇偏累,我在想等等要...

用React刻自己的投资Dashboard Day17 - Dashboard 2.0版路由功能

tags: 2021铁人赛 React 如Day15的wireframe,为了要加上更多的功能,因此...

[Github] Github 打破100MB限制 上传大型档案 ㄏㄏ

安装 https://git-lfs.github.com/ $ git lfs install $...

Day-24 DOM Node

DOM节点的建立 建立新元素 建立新元素,系使用 document.createElement(),...

EP14 - [TDD] 订单 Order 类别

Youtube 频道:https://www.youtube.com/c/kaochenlong ...