如何为托管在Amazon ECS上的服务器运行Node.js工作?
问题描述:
我们在Amazon ECS上有一个节点服务器,每秒钟的命中次数达到100次。由于JavaScript是单线程的,我们不想阻塞事件循环。所以我们需要创建一个定期从数据库中提取数据并将数据加载到内存中的工作者。这可能需要一段时间,所以我们要创建一个工作人员,以便有不同的事件循环。我们如何与ECS做到这一点?我们可以只使用一个npm,还是我们必须做一些特别的事情,比如在亚马逊控制台上设置额外的东西来建立一个单独的工作者?如何为托管在Amazon ECS上的服务器运行Node.js工作?
答
首先,您可以使用cluster模块来利用多核系统,这将改善服务器可以承受的负载。
基本集群示例
const cluster = require('cluster');
const express = require('express');
const port = 3000;
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
let app = express();
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(port,() => {
console.log(`App listening on port ${port}!`);
});
}
AWS
您可以使用AWS Elastic Load Balancing这将加载多个EC2实例之间的平衡。 然后,您可以使用auto scaling自动调高EC2容量。
当您的服务器达到特定阈值时,自动缩放将启动N个负载均衡器将向其发送流量的实例。这样你有多个EC2实例为请求服务。
因此,我们需要创建一个工作人员定期从 数据库中提取数据并将数据加载到内存中。
你可以有一个工人EC2实例(此实例不会被接受请求,所以你应该把它添加到负载均衡器),将执行你可能有繁重的任务,并将其加载到Redis,其中亚马逊还支持Amazon ElastiCache。然后您的Web服务器实例将从Redis读取这些数据。
此工人实例只是一个普通的EC2实例。你可以创建你创建你的其他EC2实例以同样的方式,你应该标记不同的,这样的事情:
注:这是许多方法来执行你问一个,我列出的所有服务都有其他选择,但为了保持“简单”,我只提供您正在使用的AWS产品。
谢谢。我怎样才能有一个工人EC2实例?我已经有一个ECS上有12个容器实例的集群。我需要在AWS控制台中更改任何内容吗?或者我可以只写JavaScript代码,将为我照顾这个? – PythonNoobile
对不起,我正在运行ECS(亚马逊EC2容器服务),而不是EC2。你知道我会如何做到这一点?谢谢! – PythonNoobile
@PythonNoobile我误读了,我读了标签amazon-ec2并继续前进。当我回家时,让我回到你身边:) –