ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

BullMQ 6.x 版本演进全解析:从 v6.0 可插拔后端架构到 v6.3.8 的完整变更清单

BullMQ 6.x 版本演进全解析:从 v6.0 可插拔后端架构到 v6.3.8 的完整变更清单 后端消息队列任务调度【免费下载链接】bullmqBullMQ - Message Queue and Batch processing for NodeJS, Python, .NET, Elixir, Rust and PHP based on Redis or PostgreSQL项目地址https://gitcode.com/gh_mirrors/bu/bullmq点击查看免费下载本文围绕 BullMQ 6.x 系列的官方更新日志docs/gitbook/changelog.md展开系统梳理从 2026 年 7 月 v6.0.0 发布到 2026 年 9 月 v6.3.8 之间所有特性、破坏性变更与缺陷修复并结合仓库源码说明每项改动背后的实现原理。读完本文你将掌握 v6 迁移的完整破坏性变更清单、可插拔后端Redis / PostgreSQL架构的演进脉络以及每个补丁版本对 Worker、流Flow、去重、Bun/ioredis 客户端等模块的具体影响可直接作为升级评估与排障手册使用。版本时间线与发布概况BullMQ 6.x 系列采用语义化版本SemVer当前仓库最新版本为6.3.8见 src/version.ts。6.x 周期内的发布节奏分为两类Minor 版本6.0、6.1、6.2、6.3携带新特性与破坏性变更Patch 版本6.0.x ~ 6.3.x以依赖升级、安全补丁、跨语言客户端Python / Elixir / PHP / Rust / .NET同步修复为主。值得注意的是部分补丁版本标注为Nothing changed, triggered by a … version release如 6.3.4、6.3.1、6.2.1即 Node.js 核心包本身无改动仅因其他语言客户端发版而触发一次版本号递增用于保持多语言版本对齐。版本日期类型核心内容6.0.02026-07-30Major引入 IQueueBackend 可插拔后端抽象Redis / PostgreSQL 双后端6.0.32026-07-31PatchPostgreSQL schema 对象去掉冗余bullmq_前缀elixir/python6.0.6 ~ 6.0.112026-08Patchcron-parser、安全补丁、ioredis 可选项、Worker 阻塞读取恢复6.1.02026-08-12MinorPostgreSQL schema 迁移显式化migrate: true / runMigrations6.1.12026-08-14PatchFlow 允许从根父节点继承 parent opts6.2.02026-08-21MinorJob 与 Worker 新增泛型 ProgressType 参数6.2.22026-08-25Patch延迟失败处理不再计入速率限制python/elixir/rust/dotnet6.3.02026-08-26MinorPostgreSQL 转发:ssl选项给 Postgrexelixir6.3.22026-08-29PatchRust 依赖 msgpackr 2.1.0 / uuid 1.26.0Python 委托 maximumBlockTimeout 给后端6.3.32026-08-31PatchBun duplicate()/reconnect 定位正确服务器Worker 重连时保活阻塞客户端6.3.5 ~ 6.3.62026-09Patchcron-parser 5.10.1Bun 懒加载适配器支持嵌套 duplicate()6.3.72026-09-18Patch去重键清理job key 不存在时删除去重键python/elixir/php/rust/dotnet6.3.82026-09-18PatchPostgreSQL LISTEN 连接失败后重试#4729/#4781v6.0.0可插拔后端架构与破坏性变更全解v6.0.0 是 6.x 系列的基石核心特性是引入 IQueueBackend 抽象层并提供 Redis 与 PostgreSQL 两套内置后端实现同时将这一架构同步到 PHP、Python、Elixir 等语言客户端。IQueueBackend与数据存储解耦的队列语义契约在 src/interfaces/queue-backend.ts 中IQueueBackend被定义为描述Queue、Worker、Job类所需全部高层操作的、与数据库无关的契约。它的设计目标是把队列语义移动任务到 active、延长锁、提升任务等从底层数据存储中彻底抽象出来接口方法刻意沿用原RedisQueueBackend的命名与签名使 Redis 适配器成为近乎即插即用的实现原先散落在 Queue / Worker / Job 三个类中的直接数据存储命令队列元数据、任务查询、阻塞式等待下一个任务原语等被提升到接口层三个类不再直接触达数据存储低层 Redis 专属辅助Lua KEYS/ARGV 构造、错误码映射、runCommand等刻意不属于该契约保留为 Redis 适配器的私有实现细节。接口还包含连接生命周期管理waitUntilReady/close/disconnect、队列键构造toKey/parseNodeKey、任务增删addJob/addJobs/addFlow/addJobScheduler、状态迁移moveToActive/moveToCompleted/moveToDelayed/moveStalledJobsToWait、锁管理extendLock/extendLocks、去重键操作、Job Scheduler 管理、队列查询与元数据维护、事件流读取readEvents以及 Worker 阻塞原语waitForJob/disconnectBlocking/reconnectBlocking等完整操作集。后端工厂与进程级默认后端IQueueBackend通过BackendFactory注入到队列类中。仓库提供了进程级默认后端切换机制位于 src/utils/create-backend.tsimport { createPostgresBackend, setDefaultBackendFactory } from bullmq; // 将进程内所有 Queue / Worker / FlowProducer 指向 PostgreSQL 后端 setDefaultBackendFactory(createPostgresBackend);默认工厂初始化为createRedisBackend保证不传任何参数时行为与历史版本完全一致调用setDefaultBackendFactory()不传参或传undefined可重置回 Redis 后端Redis 工厂会为 Worker 创建专用阻塞连接BZPOPMIN用避免阻塞拉取拖慢常规操作连接名形如prefix:base64(queue)(:w:name)。PostgreSQL 后端工厂见 src/postgres/create-postgres-backend.tsopts.connection可以是连接字符串、node-postgres 连接池配置可携带schema字段或已构建的pg.Pool实例pg仅在传入配置/字符串时被懒加载 require纯 Redis 用户无需安装它。Worker 与 QueueEvents 的长连接还会按:w:name/:qe规则命名使其可通过pg_stat_activity被发现对应 Redis 的getWorkers/getQueueEvents机制。v6.0.0 破坏性变更逐条解读v6.0.0 共声明 15 项破坏性变更升级前务必逐条对照高层类不再暴露 Redis 内部细节可选Connection构造参数被可选BackendFactory取代Queue#client、Queue#redisVersion、Queue#databaseType、Worker#blockingClient、FlowProducer#client全部移除需通过getBackend()返回的RedisQueueBackend访问原始 Redis 客户端Worker#waitUntilReady()现在解析为void而非 Redis 客户端。移除传统可重复任务Repeatable Jobs及其 API包括Queue#add/Queue#addBulk上的repeat选项、Repeat类、Queue#getRepeatableJobs()、Queue#removeRepeatable()、Queue#removeRepeatableByKey()。官方迁移路径是改用Job Schedulers见 docs/gitbook/guide/job-schedulers 与 src/classes/job-scheduler.ts。最低 Node.js 版本提升至 14.17.0见 package.json 的engines字段。Worker#resume()变为异步返回Promisevoid必须await。Queue#clean()遥测变化现在上报清理的任务数量而非完整的任务 ID 数组。遥测属性清理移除已废弃的TelemetryAttributes.JobFinishedTimestamp与TelemetryAttributes.JobStatus遥测改用JobStateWorker 不再在 span 上设置 JobFinishedTimestamp。Meter#createGauge()成为遥测适配器的必选方法。去重取代防抖移除废弃的debounce选项与Job#debounceId属性改用 deduplication 与Job#deduplicationId。移除废弃的debounced事件改为监听deduplicated事件。FlowJob 区分父节点与叶子节点父 Flow 节点不再允许去重。Job#discard()从 Node.js API 移除改用UnrecoverableError对应 src/classes/errors/unrecoverable-error.ts。移除遗留的nextSchedulerJobId属性Job 与 JobJson 中。ioredis 不再是直接依赖变为可选 peer 依赖Redis 用户必须显式安装 ioredis这是 v6.0.10 中 make ioredis optional 的最终形态。暂停态paused从 JobType 与默认Queue#getJobCounts()结果中移除暂停队列中的任务以 waiting 状态表示。RepeatOptions 选项收紧不再接受 cron-parser 的currentDate、utc、nthDayOfWeek时区统一用tz: UTC替代utc: true。此外公开的 Redis 实现导出Scripts、createScripts、JobJsonRaw、RedisJobOptions被移除一律改用后端 API。PostgreSQL 后端的演进迁移、SSL 与连接可靠性v6 的 PostgreSQL 后端在 6.0 ~ 6.3 期间经历了持续打磨更新日志中与 Postgres 相关的条目占比最高。6.1.0schema 迁移显式化v6.1.0 将 PostgreSQL 的 schema 迁移机制改为显式#4544。相关实现见 src/postgres/migrator.ts迁移通过runMigrations()显式执行或在连接配置上设置migrate: true自动触发整个迁移运行在单一事务内全部待应用迁移的 SQL 与其账本行一起提交或一起回滚杜绝半迁移状态迁移.sql文件因此只允许包含事务安全语句CREATE INDEX CONCURRENTLY、VACUUM、CREATE DATABASE等被明确禁止通过事务级pg_advisory_xact_lock串行化并发启动者多个 Queue/Worker 实例同时启动锁以hashtext(schema)按 schema 命名空间隔离且随事务提交/回滚自动释放、不会泄漏默认 schema 为bullmq见 src/postgres/migrator.ts 的DEFAULT_SCHEMA作为连接级命名空间取代 Redis 的按队列 key 前缀最低支持 PostgreSQL 13推荐 14低于最低版本会抛出UnsupportedPostgresVersionErrorschema 比当前 BullMQ 新会抛出SchemaVersionMismatchError提示升级 BullMQ不支持降级 schemaschema 未初始化则抛出SchemaMigrationRequiredError。仓库中的迁移文件位于 src/postgres/migrations0001_schema.sql建表、0002_functions.sql操作函数、0003_dedup_stale_key.sql去重过期键。6.3.0Elixir 客户端转发 :ssl 选项v6.3.0 为 Elixir 客户端将:ssl选项转发给 Postgrex 连接#4631使 Elixir 的 PostgreSQL 后端能够在启用 SSL 的数据库环境如托管 PG中正常工作。6.3.8LISTEN 连接失败重试最新版本 v6.3.8 修复了 PostgreSQL 后端的LISTEN 连接失败后不重试的问题#4781关联 issue #4729。PostgreSQL 后端的 Worker 唤醒依赖LISTEN/NOTIFY对应 Redis 的BZPOPMIN标记集合阻塞原语见 src/interfaces/queue-backend.ts 中waitForJob的注释一旦 LISTEN 专用连接建立失败且不重试Worker 将永远收不到新任务通知。该修复确保 LISTEN 连接在失败后能自动重建保障 PostgreSQL 后端 Worker 的持续可用性。其他 Postgres 相关修复6.0.3删除 schema 对象上冗余的bullmq_前缀elixir/python6.0.8SQL loader 目录无法解析时快速失败fail fast避免在运行时才暴露路径问题见 src/postgres/sql-loader.ts6.0.8避免深度导入 ioredis 内部使 PostgreSQL 后端可在无 ioredis 内部依赖的环境运行。端到端验证方式可参考 tests/postgres/worker.test.tssetDefaultBackendFactory指向createPostgresBackend后运行完整的 add → LISTEN/NOTIFY 唤醒 → moveToActive → 处理 → moveToCompleted 闭环与 tests/postgres/operations.test.ts后端契约级 FIFO 操作切片测试。多语言客户端同步修复与依赖维护6.x 周期内大量补丁用于跨语言客户端Python / Elixir / PHP / Rust / .NET的同步修复说明 BullMQ 生态已把多语言一致性纳入版本发布流程6.3.7去重键清理——当任务 key 已不存在时删除对应去重键python/elixir/php/rust/dotnet。这对应 Redis 侧的recoverStaleDeduplicationKey/removeDeduplicationKeyLua 脚本逻辑见 src/commands/includes/recoverStaleDeduplicationKey.lua防止去重键成为永久占位、阻塞同名任务重新入队。6.2.2处理延迟失败deferred failures时不再影响速率限制计数python/elixir/rust/dotnet避免失败重试路径错误消耗限流额度。6.3.2Rust 客户端升级 msgpackr 至 2.1.0、uuid 至 1.26.0Python 客户端将maximumBlockTimeout委托给后端实现对应 src/interfaces/queue-backend.ts 中可选的maximumBlockTimeout只读属性——PostgreSQL 的LISTEN/NOTIFY可返回更大的值让空闲 Worker 停止反复轮询。6.0.3、6.3.0Elixir/Python 的 PostgreSQL schema 前缀与 SSL 选项同步。6.3.1、6.2.1、6.3.4仅因 Elixir / Rust 客户端发版触发的空版本。依赖与安全维护方面6.0.6 / 6.3.5 升级cron-parserv5.7.0 → v5.10.1Job Scheduler 的 cron 解析依赖6.0.4 / 6.0.11 / 6.1.2 均为安全补丁升级6.1.2 明确标注[security]。Worker 与流Flow的稳定性修复Worker 侧的多处修复直接关系到生产环境的稳定性6.0.7重连后恢复永不 settle的阻塞读取fixes #4479。Worker 的阻塞拉取BZPOPMIN/LISTEN在重连后若未正确恢复会导致任务卡住不被消费。6.3.3重连parked in reconnecting时保持阻塞客户端存活——避免 Worker 重连期间阻塞连接被误关闭保证重连完成后能继续拉取任务同版本还修复了 Bun 客户端duplicate()与 reconnect 定位到错误服务器的问题#4591。6.3.2Python 客户端将maximumBlockTimeout委托给后端见上文使空闲 Worker 的轮询间隔与后端阻塞原语能力匹配。Flow父子任务流相关6.1.1允许从根父节点root parent继承 parent optsfixes #4547。这使 Flow 树中的子任务可以沿用根父节点传入的选项而不必逐层重复声明。6.0.0破坏性变更FlowJob 现在区分父节点与叶子节点且父 Flow 节点不允许去重——这是对依赖树语义的收紧避免父节点去重导致整棵子树语义混乱。客户端适配器与类型系统的细节改进6.0.10ioredis 变为可选依赖。这与createRedisBackend的实现相呼应——src/utils/create-backend.ts 仅在需要时才创建 ioredis 客户端并支持共享连接shared: isRedisInstance(opts.connection)与重复duplicate两种模式。6.0.9completed事件的返回值类型修正为反序列化后的值fixes #4147与moveToCompleted返回returnValue的语义对齐避免事件消费者拿到序列化字符串。6.2.0为Job与Worker添加泛型ProgressType参数fixes #3721。升级后可以显式声明进度值的类型例如new WorkerDataType, ResultType, NameType, ProgressType(...)进度相关的updateProgress、progress属性获得完整类型推导。6.3.6允许在懒加载lazyBun 适配器上进行嵌套duplicate()补全 Bun 客户端与 ioredis 行为的一致性。升级与验证建议基于以上变更从 v5.x 升级到 v6.x以及 v6 内部小版本升级时建议按以下顺序操作对照 v6.0.0 破坏性变更清单逐项排查重点检查自定义的 Connection 注入改为BackendFactory、Repeat 相关 API迁移到 Job Schedulers、debounce改用 deduplication、Job#discard()改用UnrecoverableError、Worker#resume()补await。显式安装 ioredisRedis 用户npm install ioredis bullmq因为 ioredis 已降级为可选 peer 依赖。PostgreSQL 用户确认迁移策略设置migrate: true或显式调用runMigrations()并确认 PostgreSQL ≥ 13推荐 ≥ 14多实例启动时依赖 advisory lock 自动串行化无需人工编排。升级后运行测试套件验证仓库提供多后端测试命令可在 package.json 中查看test:ioredis、test:postgres、test:valkey-glide、test:node-redis、test:bun等脚本后端契约一致性由 tests/adapter-conformance.test.ts 保障。完整的逐版本变更记录可直接查阅 docs/gitbook/changelog.md当前 6.x 周期与仓库根目录 CHANGELOG.md历史全量记录两者内容一致后者还包含 v5.x 及更早版本的迁移脉络。赞分享后端消息队列任务调度【免费下载链接】bullmqBullMQ - Message Queue and Batch processing for NodeJS, Python, .NET, Elixir, Rust and PHP based on Redis or PostgreSQL项目地址https://gitcode.com/gh_mirrors/bu/bullmq点击查看免费下载相关推荐WeKan 附件与文件存储详解五种可插拔后端、文件迁移与可搜索文档预览的实现WeKan 附件与文件存储详解五种可插拔后端、文件迁移与可搜索文档预览的实现 WeKan 将卡片附件、用户头像与看板背景图统一放在一套可插拔的文件存储体系之下后端消息队列任务调度AppIntro版本演进从5.x到6.x的重大改进与API变更AppIntro版本演进从5.x到6.x的重大改进与API变更 AppIntro作为Android平台广泛使用的引导页库其6.x版本带来了全面的架构升级与A移动开发UI组件Sanity Studio 6 版本演进全解析从 CHANGELOG 看 v6.0 到 v6.14 的核心变更与升级实践Sanity Studio 6 版本演进全解析从 CHANGELOG 看 v6.0 到 v6.14 的核心变更与升级实践 本文以当前仓库中 packages/CMS前端上一篇CANN Ascend C单核形状设置下一篇WebShell代码结构剖析理解PHP后门的实现原理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表