promise实现高可靠性发布订阅队列的核心是利用其链式执行、状态不可逆和错误可捕获特性,确保事件顺序处理、容错与可追溯;订阅者必须返回promise以支持串行执行、失败策略(continue/retry/abort/fallback)、超时控制、上下文透传及动态管理。

用 Promise 实现高可靠性的发布订阅事件队列,核心不是“用 Promise 包裹回调”,而是利用 Promise 的链式执行、状态不可逆、错误可捕获等特性,确保事件处理的顺序性、容错性和可追溯性。关键在于:每个订阅者必须返回 Promise,发布者按序等待前一个完成再触发下一个,且支持失败重试或降级。
订阅者必须返回 Promise,且支持错误传递
普通回调无法判断是否完成或失败,而 Promise 能统一处理成功/失败路径。订阅函数应返回 Promise,并在出错时 reject,让队列能感知中断并决策后续行为(如跳过、重试或终止)。
- 订阅函数签名建议为 (payload) => Promise
,明确返回值语义 - 避免在订阅函数中吞掉错误(比如 try/catch 后不 rethrow 或不 return Promise.reject())
- 示例:const sub1 = (data) => fetch('/api/log', { method: 'POST', body: JSON.stringify(data) })
发布者按序串行执行,支持可控并发与失败策略
默认采用串行执行(Promise.reduce 风格),保证事件处理严格有序;也可扩展为有限并发(如最多 3 个同时进行),但需维护 pending 数和错误聚合逻辑。
- 基础串行实现:用 Array.prototype.reduce 链式调用每个订阅者的 Promise
- 失败策略可配置:continue(跳过当前)、retry(重试 2 次)、abort(终止后续)、fallback(执行备用函数)
- 每次执行后记录结果(包括耗时、状态、错误堆栈),便于监控和排查
支持动态订阅管理与上下文透传
真实场景中,订阅可能随生命周期增删,且不同事件需携带不同上下文(如 request ID、trace ID)。队列需支持带 key 的订阅注册、按 key 取消、以及 payload 外透传 context 对象。
- 内部用 Map 存储 topic → Array,id 用于精准取消
- publish 方法支持第二个参数 context,自动合并进 payload 或单独传入每个订阅者
- 取消订阅时,清除对应 Promise 链中的待执行项(注意:已开始执行的无法中断,但可忽略其结果)
内置超时控制与可观测性钩子
网络请求或异步操作可能卡死,必须设置单个订阅者执行超时;同时提供 before/after/error 钩子,方便打日志、埋点或熔断统计。
- 每个订阅执行前启动定时器,超时则 reject 并标记为 TIMEOUT 错误
- 钩子函数也返回 Promise,允许异步日志(如上报到 Sentry)不影响主流程
- 暴露 .status() 方法,返回当前队列长度、pending 订阅数、最近 10 条执行记录
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











