node.js - 用于执行长时间运行的后台任务的 Node.js 库
问题描述
我有一个带有 express.js 网络服务器的架构,它通过 REST API 接受新任务。
此外,我必须有另一个进程来创建和监督其他服务器(分布式系统)上的许多其他任务。这个过程应该在后台运行并且运行很长时间(几个月,几年)。
现在的问题是:
1) 我是否应该创建一个带有任务队列的单个 Node.js 应用程序,例如 Bull.js/Redis 或 Celery/Redis,它基本上会在开始时启动这个长时间运行的任务。
或者
2) 我是否应该有两个进程,一个用于 REST API,另一个用于调度和管理分布式系统中的任务的守护进程?
我非常倾向于解决方案2)。
画:
解决方案
我现在面临同样的问题。正如我们所知,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 很好,因为您也可以在本地存储中存储消息、队列和..。但就我个人而言,我找不到任何合适的解决方案来平衡这些线程。也许这不是你的答案,但我希望你能在这里得到一些线索。
推荐阅读
- javascript - 错误:对象在 reactjs 中作为 React 子级无效(发现:[object Promise])
- python - 使用seaborn绘制热图时如何将刻度定位到网格中心?
- laravel - laravel 多值验证规则
- ruby-on-rails - 您将如何在 Rails 控制器中验证上传文件的 mime_type?
- javascript - Vuejs:渲染组件后替换内容
- django - 使用 google django 创建社交身份验证功能
- ios - Xcode12中的任何ios设备(arm64)是什么?
- python - Python如何将语音识别单词保存到列表中?
- flutter - 如何在 Flutter 中读取渲染树之外的存储值
- hibernate - Spring Data JPA + H2 嵌入式持久性:CrudRepository.save 仅在重新启动时保存到内存中不再看到更改