Node.js 搭配 Bull v3 是如何实现作业并行处理的?
bull库并行任务处理机制解答
你观察到的并行处理、主应用无阻塞的效果,是bull结合自身架构设计和Node.js底层能力实现的,核心机制分为三个部分:
- 任务与主应用完全解耦
bull基于Redis实现任务的存储和调度,主应用仅需要向Redis队列中写入任务,不需要参与任务的执行逻辑,消费过程和主应用的JS主线程完全隔离,自然不会阻塞主应用的其他功能。 - 多Worker实例并行消费
bull支持启动任意数量的独立Worker实例,这些实例可以是同一进程内通过worker_threads创建的独立线程,也可以是完全独立的Node.js进程。每个Worker都会单独从Redis拉取任务执行,你场景中两个重负载作业同时运行,本质就是两个Worker实例在并行处理,完全不占用主应用的线程资源。 - 单Worker的并发能力
就算仅启动一个Worker实例,也可以通过配置concurrency参数实现单Worker内的多任务并行:- 针对IO密集型任务,直接利用Node.js本身的异步IO能力,底层由libuv调度,不会阻塞Worker的JS主线程
- 针对CPU密集型任务,bull会自动将任务放到独立的子线程中执行,避免阻塞Worker自身的主线程
补充说明:大家常说的JavaScript单线程,仅指JS代码执行的主线程是单线程,并非Node.js进程只有一个线程,Node.js底层本身内置了线程池处理异步任务,再加上bull主动用多进程/多线程做消费隔离,自然可以实现重负载任务并行、主应用不受影响的效果。
内容的提问来源于stack exchange,提问作者Makis
相关产品推荐
相关产品推荐

