我有一个通过REST API接受新任务的express.js new服务器的架构。
此外,我必须有另一个进程来创建和监督其他服务器(分布式系统)上的许多其他任务。这个进程应该在后台运行,并且运行很长一段时间(几个月、几年)。
现在的问题是:
1)我是否应该创建一个带有任务队列的Node.js应用程序,比如bull.js/Redis或Celery/Redis,它基本上是在一开始就启动这个长时间运行的任务。
或
2)我是否应该有两个进程,一个用于REST API,另一个用于调度和管理分布式系统中的任务?
我非常倾向于解决方案2)。
绘制:

发布于 2019-11-14 20:36:05
我现在也面临着同样的问题。正如我们所知,nodejs在单线程中运行。但是我们可以为并行创建工作者,或者处理一些我们不想影响主服务器的花费时间的函数。幸运的是,nodejs支持多线程。
看一下这个例子:
const worker = require('worker_threads');
const {
Worker, isMainThread, parentPort, workerData
} = require('worker_threads');
if (isMainThread) {
module.exports = function parseJSAsync(script) {
return new Promise((resolve, reject) => {
const worker = new Worker(__filename, {
workerData: script
});
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', (code) => {
if (code !== 0)
reject(new Error(`Worker stopped with exit code ${code}`));
});
});
};
} else {
const { parse } = require('some-js-parsing-library');
const script = workerData;
parentPort.postMessage(parse(script));
}https://nodejs.org/api/worker_threads.html
在nodejs中搜索一些关于多线程的文章。但请记住,这里的状态不能与线程共享。你可以使用一些像kafka,rabbitmq(我推荐的),redis这样的消息代理来处理这样的需求。
kafka在生产中很难配置。rabbitmq很好,因为您也可以在本地存储中存储消息、队列和..。但就我个人而言,我找不到任何适当的解决方案来平衡这些线程的负载。也许这不是你的答案,但我希望你能在这里得到一些线索。
https://stackoverflow.com/questions/58854369
复制相似问题