- OutboxDispatcher: 每 5s 轮询 OutboxEvent 表,CAS 领取 → 验证 → BullMQ 投递 → 标记 published - 采用 ADR-003 §4.3 先 CAS 后投递算法:markProcessing(CAS) → queue.add() → markPublished - BullMQ jobId = AiJob.id(幂等重复 add) - 崩溃窗口保护:bullmq jobId 幂等 + releaseExpiredLocks(60s) - 错误处理:永久失败(未知eventType/Job不存在/非法queueName/超过最大尝试) vs 暂时失败(exponential backoff 回退 pending) - 仅在 WorkerModule 注册(API 进程不运行 Dispatcher) Co-Authored-By: Claude <noreply@anthropic.com>