首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于执行长时间运行的后台任务的Node.js库

用于执行长时间运行的后台任务的Node.js库
EN

Stack Overflow用户
提问于 2019-11-14 18:19:05
回答 1查看 1.3K关注 0票数 0

我有一个通过REST API接受新任务的express.js new服务器的架构。

此外,我必须有另一个进程来创建和监督其他服务器(分布式系统)上的许多其他任务。这个进程应该在后台运行,并且运行很长一段时间(几个月、几年)。

现在的问题是:

1)我是否应该创建一个带有任务队列的Node.js应用程序,比如bull.js/Redis或Celery/Redis,它基本上是在一开始就启动这个长时间运行的任务。

2)我是否应该有两个进程,一个用于REST API,另一个用于调度和管理分布式系统中的任务?

我非常倾向于解决方案2)。

绘制:

EN

回答 1

Stack Overflow用户

发布于 2019-11-14 20:36:05

我现在也面临着同样的问题。正如我们所知,nodejs在单线程中运行。但是我们可以为并行创建工作者,或者处理一些我们不想影响主服务器的花费时间的函数。幸运的是,nodejs支持多线程。

看一下这个例子:

代码语言:javascript
复制
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很好,因为您也可以在本地存储中存储消息、队列和..。但就我个人而言,我找不到任何适当的解决方案来平衡这些线程的负载。也许这不是你的答案,但我希望你能在这里得到一些线索。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58854369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档