运行 节点中的后台任务需要什么?

What does it take to run background tasks in node?

如果我的理解是正确的,处理后台任务是释放 cpu 绑定任务的主线程的好方法。

我不明白的是像 bull 或 kue 这样的系统使用什么来 运行 主线程之外的任务。

他们使用线程吗?他们需要一个完整的节点进程分支吗?它们会生成子进程吗?

Bull 基于 Redis,它在自己的进程中处理这些作业的数据处理和排​​队。 它是一个轻量级、健壮且快速的作业处理队列。它使用 redis 进行持久化,因此如果服务器因任何原因宕机,队列也不会丢失。

可以看到Job的内部实现here

Kue 模块也是如此,它是由 redis 进程支持的优先级作业队列,专为 node.js 而构建。后台任务由 Redis 提供支持。

这意味着这些模块依赖于启用不同创建后台作业的 Redis 外部进程。

通过 Redis pubsub 在作业实例上触发特定于作业的事件:

  • enqueue 作业正在排队
  • promotion 作业从延迟状态提升到排队状态
  • progress作业进度0-100
  • failed attempt作业失败,但还有剩余的尝试次数
  • failed 作业失败,没有剩余的尝试次数
  • complete作业已完成
  • remove 作业已删除

延迟作业由 Redis 队列提供支持,它 notifies/triggers 支持模块中的回调。

那不是 node.js 的工作方式。 Node.js 在内部使用事件循环来处理请求(因此,使其成为一个事件驱动的框架)

整个事件循环 运行 在单个线程中。当您执行长 运行 命令(例如 I/O 或网络操作)时,请求将进入循环队列并且进程不会阻塞。操作完成后,它会在您的代码中触发回调