从npm迁移到纱线pnp
几个月前,我们开始使用yarn2 (pnpify)作为我们的monorepo,因为node_modules确实增长到了200K包。多亏了yarn2,我们将所有软件包的构建和部署时间从40分钟缩短到4到5分钟,这真是太棒了。
前端包很容易被树抖动和捆绑,以便创建一个小工件并上传到一个存储容器中。
后端包(Nestjs、Rest和GraphQl API)有点棘手,以便在集群模式下使用pm2运行构建。
PM2
使用PM2,您可以在fork或cluster模式下运行应用程序。
在同一个端口上运行应用程序时,需要使用cluster模式。
Fork模式在启动第一个分叉(这是完全合法的)后一直说端口已经在使用了。
由于我们使用的是yarn2,所以我们只能使用yarn作为解释器运行我们的应用程序,方法是:
yarn node ./build/main.js为了有正确的模块解析,因为节点不理解它。
--这就是问题所在:
纱线(和npm)在集群模式下表现不佳。
这是因为您需要使用节点本身作为解释器,而不是纱线(或npm)。
因此,我们得到了下面的ecosystem.config.js
{
"apps": [
{
"args": "node ./build/main.js",
"exec_mode": "cluster",
"instances": "max",
"interpreter": "bash",
"name": "api",
"script": "yarn",
"time": true
}
]
}我们将我们的部署发送到一个拥有多个CPU核心的VM,并用新的生态系统重新加载pm2服务。所有的东西都是绿色的,但是我们注意到只有一个进程在监听端口3000,所有其他进程都抛出了一个EADDRINUSE错误。纱线会发出错误,而不是抛出错误,因此PM2认为应用程序仍在运行。
或者至少这是我们的结论。
捆绑NestJS是不可能的:捆绑巢
我唯一的解决方案是通过这样的操作来将nestjs本身聚集起来:
import { Injectable } from '@nestjs/common';
import { fork, isMaster, on } from 'cluster';
import * as os from 'os';
const numCPUs = os.cpus().length;
// const randomNumber = (min: number, max: number) =>
// Math.floor(Math.random() * max) + min;
@Injectable()
export class ClusterService {
// eslint-disable-next-line @typescript-eslint/ban-types
static clusterize(callback: Function): void {
if (isMaster) {
// eslint-disable-next-line no-plusplus
for (let i = 0; i < numCPUs; i++) {
fork();
}
on('exit', (worker, code) => {
fork();
// eslint-disable-next-line no-console
console.log(
`[Cluster] worker[${worker.process.pid}] died with status: [${code}], creating new worker`,
);
});
} else {
callback();
}
}
}并在单个实例上运行PM2,但这感觉有点奇怪,因为PM2可以为您做到这一点。以更好的方式。
有没有办法用yarn2“弹出”yarn2,这样我们就可以将应用程序作为一个真正的节点进程运行?
是否有一种方法可以在同一端口上以群集模式运行PM2,同时使用yarn作为解释器?
如何在yarn2中抛出错误而不是发出错误,以便PM2创建一个新进程?
..。或者,在gitlab中是否有另一种解决方案只使用npm,而不需要等待40分钟就可以构建包并使用节点解释器n pm2运行nestjs应用程序?
发布于 2021-08-04 15:07:17
更新
您不需要纱线以纱线的模块分辨率运行应用程序。
在以节点作为解释器运行应用程序时,唯一需要的是要求.pnp.js。将"interpreter_args": "--require /path/to/.pnp.js",添加到pm2配置中
ecosystem.config.js:
{
"apps": [
{
"name": "my-app",
"script": "./main.js",
"interpreter_args": "--require /path/to/.pnp.js",
"exec_mode": "cluster"
}
]
}现在,您可以执行pm2 start ecosystem.config.js,而不会遇到任何与未找到的节点模块有关的错误。
发布于 2021-06-23 13:42:05
yarn exec pm2 start ecosystem.config.js和不保存pm2进程。pm2只能在npm模式下复活,不会在纱线模式下执行您的脚本。
缺点是您无法使用pm2启动来从pm2重新启动。因此,您需要自己实现一个systemd服务,它将在启动时执行一个yarn pm2:start。
2个可能的特征解决方案:
https://stackoverflow.com/questions/65396323
复制相似问题