运行 节点中的后台任务需要什么?
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 或网络操作)时,请求将进入循环队列并且进程不会阻塞。操作完成后,它会在您的代码中触发回调
如果我的理解是正确的,处理后台任务是释放 cpu 绑定任务的主线程的好方法。
我不明白的是像 bull 或 kue 这样的系统使用什么来 运行 主线程之外的任务。
他们使用线程吗?他们需要一个完整的节点进程分支吗?它们会生成子进程吗?
Bull 基于 Redis,它在自己的进程中处理这些作业的数据处理和排队。 它是一个轻量级、健壮且快速的作业处理队列。它使用 redis 进行持久化,因此如果服务器因任何原因宕机,队列也不会丢失。
可以看到Job的内部实现here
Kue 模块也是如此,它是由 redis 进程支持的优先级作业队列,专为 node.js 而构建。后台任务由 Redis 提供支持。
这意味着这些模块依赖于启用不同创建后台作业的 Redis 外部进程。
通过 Redis pubsub 在作业实例上触发特定于作业的事件:
enqueue
作业正在排队promotion
作业从延迟状态提升到排队状态progress
作业进度0-100failed attempt
作业失败,但还有剩余的尝试次数failed
作业失败,没有剩余的尝试次数complete
作业已完成remove
作业已删除
延迟作业由 Redis 队列提供支持,它 notifies/triggers 支持模块中的回调。
那不是 node.js 的工作方式。 Node.js 在内部使用事件循环来处理请求(因此,使其成为一个事件驱动的框架)
整个事件循环 运行 在单个线程中。当您执行长 运行 命令(例如 I/O 或网络操作)时,请求将进入循环队列并且进程不会阻塞。操作完成后,它会在您的代码中触发回调