首页 > 解决方案 > 用于执行长时间运行的后台任务的 Node.js 库

问题描述

我有一个带有 express.js 网络服务器的架构,它通过 REST API 接受新任务。

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

现在的问题是:

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

或者

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

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

画:

我应该选择一个流程还是两个流程

标签: node.jssystemdaemon

解决方案


我现在面临同样的问题。正如我们所知,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 很好,因为您也可以在本地存储中存储消息、队列和..。但就我个人而言,我找不到任何合适的解决方案来平衡这些线程。也许这不是你的答案,但我希望你能在这里得到一些线索。


推荐阅读