Skills DirectorySkills Directory
SkillsLearnSecurityCategoriesDocsBlogPro
Sign InSubmit Skill
Skills Directory

Security-tested agent skills for Claude, coding agents, and AI workflows.

Directory

  • Browse Skills
  • All Skills A–Z
  • Claude Skills
  • Claude Code Skills
  • Agent Skills
  • Categories
  • Authors
  • Submit a Skill

Learn

  • Learn Hub
  • Install Claude Skills
  • Write SKILL.md
  • Skills vs MCP
  • Directories Compared

Security

  • Security
  • Methodology
  • Secure Claude Skills
  • Security Badges
  • Chrome Extension
  • Skill Manager

Company

  • About
  • Community
  • Blog
  • API Docs
  • Advertise

2026 Skills Directory. All rights reserved.

ProTermsPrivacyRefunds
Back to skills

Bullmq Job Queue

ASecurity

当在 Node.js/TypeScript 中需要用 Redis 做后台任务、异步处理、延迟/定时/重复任务、限流或多步任务流时使用;产出生产级的 Queue/Worker 配置、重试退避、优雅关闭与 Bull Board 监控代码;不适用于 Serverless 无 Redis 队列、复杂 Saga 工作流编排或纯事件溯源(应转 QStash/Temporal/事件架构)。触发词:BullMQ、任务队列、后台任务

3 stars
0 votes
0 copies
1 views
Added 9/19/2026
ai-agentstypescriptpythonbashnodeexpressapibackenddevops

Works with

cursorcliapi

Security Analysis

A96/100
mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned 9/19/2026

$npx -y skills add findscripter/everything-skills --skill bullmq-job-queue --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Bullmq Job Queue?

Add the live security badge to your README — it updates automatically with every re-scan.

Security grade badge for Bullmq Job Queue
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/findscripter-bullmq-job-queue/badge)](https://www.skillsdirectory.com/skills/findscripter-bullmq-job-queue)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
Files
SKILL.md
---
name: bullmq-job-queue
title: BullMQ Redis 任务队列后台处理
description: 当在 Node.js/TypeScript 中需要用 Redis 做后台任务、异步处理、延迟/定时/重复任务、限流或多步任务流时使用;产出生产级的 Queue/Worker 配置、重试退避、优雅关闭与 Bull Board 监控代码;不适用于 Serverless 无 Redis 队列、复杂 Saga 工作流编排或纯事件溯源(应转 QStash/Temporal/事件架构)。触发词:BullMQ、任务队列、后台任务
domain: 研发/backend
triggers: [BullMQ, bull queue, redis queue, redis 队列, 后台任务, background job, job queue, 任务队列, delayed job, 延迟任务, repeatable job, 重复任务, worker process, 工作进程, job scheduling, 任务调度, async processing, 异步处理, FlowProducer, 任务流]
tags: [bullmq, redis, 任务队列, 后台处理, node.js, typescript, 异步, worker, 限流, 重试退避, 定时任务, 研发]
level: 进阶
status: stable
agents: [claude-code, codex, cursor, gemini-cli]
tools: [bullmq, ioredis, @bull-board/api, @bull-board/express]
requires: []
related: [temporal-workflow-python, saga-orchestration, rest-api-endpoint-builder, error-handling-patterns]
combines_with: [nestjs-expert, error-handling-patterns, transactional-email-template-builder]
license: MIT
source: sickn33/agentic-awesome-skills
source_license: MIT
---
## 何时使用

在 Node.js/TypeScript 应用里需要把耗时或可异步的工作交给 Redis 支撑的队列后台执行时使用,典型场景:

- 发邮件、推送、生成报表等后台任务,请求侧「即发即忘」。
- 延迟任务(N 小时后提醒)、定时/重复任务(每天 9 点跑摘要)。
- 任务优先级、限流(保护下游服务)、失败重试。
- 多步任务流(父任务等待多个子任务完成,如下单 -> 校验库存/扣款/通知)。

**不该用(应转交):**

- 需要 Serverless / 边缘队列、不想自己管 Redis -> Upstash QStash。
- 复杂工作流、Saga、补偿事务、长流程编排 -> Temporal 类工作流引擎。
- 事件溯源 / CQRS / 事件流 -> 事件驱动架构。
- Redis 集群、内存调优等基础设施 -> Redis 专项;部署、K8s、扩缩容 -> DevOps。

**核心原则:** 生产者侧即发即忘;务必显式设置 job options(默认值很少合适);幂等是你的责任(任务可能执行多次);重试用指数退避防雪崩;失败任务要有归宿(死信/保留策略);并发从保守起步;job data 只传 ID 不传大对象;处理 SIGTERM 优雅关闭防止孤儿任务。

## 步骤

1. **建共享连接**:用 ioredis 建连接,必须设 `maxRetriesPerRequest: null`,否则 Redis 抖动时 Worker 会停摆。
2. **建 Queue 并配默认项**:`attempts` + 指数 `backoff` + `removeOnComplete/removeOnFail` 保留策略。
3. **建 Worker**:设置 `concurrency`(从小开始)和 `limiter` 限流;至少挂 `failed` 和 `stalled` 事件处理。
4. **入队任务**:请求处理器里尽量不 `await queue.add`(即发即忘,更快响应);按需设 `delay` / `repeat` / `priority`。
5. **多步依赖**:用 `FlowProducer` 编排父子任务。
6. **优雅关闭**:监听 `SIGTERM`/`SIGINT`,先 `pause` 再 `close`。
7. **接监控**:用 Bull Board 可视化队列与任务状态。

## 指令

```bash
npm i bullmq ioredis
npm i @bull-board/api @bull-board/express   # 可选:可视化监控
```

环境变量:`REDIS_URL`(如 `redis://localhost:6379`,托管可选 Upstash / Redis Cloud / ElastiCache / Railway)。

## 示例

**基础队列 + Worker(任何新队列从这里开始):**

```ts
import { Queue, Worker, QueueEvents } from 'bullmq';
import IORedis from 'ioredis';

// 所有队列共享同一连接
const connection = new IORedis(process.env.REDIS_URL, {
  maxRetriesPerRequest: null,  // BullMQ 必需
  enableReadyCheck: false,
});

const emailQueue = new Queue('emails', {
  connection,
  defaultJobOptions: {
    attempts: 3,
    backoff: { type: 'exponential', delay: 1000 },
    removeOnComplete: { count: 1000 },
    removeOnFail: { count: 5000 },
  },
});

const worker = new Worker('emails', async (job) => {
  await sendEmail(job.data);
}, {
  connection,
  concurrency: 5,
  limiter: { max: 100, duration: 60000 }, // 每分钟 100 个
});

worker.on('failed', (job, err) => {
  console.error(`Job ${job?.id} failed:`, err);
});
```

**延迟与定时(重复)任务:**

```ts
// 延迟任务:延迟后执行一次
await queue.add('reminder', { userId: 123 }, {
  delay: 24 * 60 * 60 * 1000, // 24 小时
});

// 重复任务:按 cron 执行,务必带时区
await queue.add('daily-digest', { type: 'summary' }, {
  repeat: { pattern: '0 9 * * *', tz: 'America/New_York' },
});

// 移除重复任务(pattern + tz 要一致)
await queue.removeRepeatable('daily-digest', {
  pattern: '0 9 * * *', tz: 'America/New_York',
});
```

**任务流与依赖(父任务等所有子任务完成):**

```ts
import { FlowProducer } from 'bullmq';
const flowProducer = new FlowProducer({ connection });

await flowProducer.add({
  name: 'process-order', queueName: 'orders', data: { orderId: 123 },
  children: [
    { name: 'validate-inventory', queueName: 'inventory', data: { orderId: 123 } },
    { name: 'charge-payment',      queueName: 'payments',  data: { orderId: 123 } },
    { name: 'notify-warehouse',    queueName: 'notifications', data: { orderId: 123 } },
  ],
});
```

**优雅关闭(部署/重启时不丢任务):**

```ts
const shutdown = async () => {
  await worker.pause();   // 停止接新任务
  await worker.close();   // 等当前任务跑完
  await queue.close();    // 关闭队列连接
  process.exit(0);
};
process.on('SIGTERM', shutdown);
process.on('SIGINT', shutdown);
```

**Bull Board 监控面板:**

```ts
import { createBullBoard } from '@bull-board/api';
import { BullMQAdapter } from '@bull-board/api/bullMQAdapter';
import { ExpressAdapter } from '@bull-board/express';

const serverAdapter = new ExpressAdapter();
serverAdapter.setBasePath('/admin/queues');
createBullBoard({
  queues: [new BullMQAdapter(emailQueue), new BullMQAdapter(orderQueue)],
  serverAdapter,
});
app.use('/admin/queues', serverAdapter.getRouter());
```

## 注意事项

逐条对应源技能的校验规则,按严重度排列:

- **[ERROR] Redis 连接缺 `maxRetriesPerRequest: null`**:Queue/Worker 连接必须设它,否则 Redis 连接出问题时 Worker 会停摆、无法重连。
- **[WARN] Worker 未挂 `stalled` 事件**:stalled 任务意味着 Worker 崩溃,必须监控。
- **[WARN] Worker 未挂 `failed` 事件**:失败任务要记录并告警。
- **[WARN] 无优雅关闭**:缺 SIGTERM/SIGINT 处理,部署时任务可能成孤儿。
- **[WARN] payload 过大**:job data 要小,传 ID 不传完整对象,降低 Redis 内存占用。
- **[WARN] 有重试但无退避策略**:retry 必须配指数退避,避免惊群(thundering herd)。
- **[WARN] 重复任务未显式指定时区**:否则用服务器本地时间,会随夏令时漂移。
- **[INFO] 请求处理器中 `await queue.add`**:建议即发即忘以加快响应。
- **[INFO] 任务无超时配置**:建议设超时,防止任务卡死。
- **[INFO] Worker 并发过高**:确认下游能扛住(数据库连接数、API 限流)。

## 互见

- Redis 基础设施 / 集群 / 内存调优 -> redis 专项技能
- Serverless / 无 Redis 队列 -> Upstash QStash
- 复杂工作流 / Saga / 长流程编排 -> Temporal 类
- 事件溯源 / CQRS / 事件流 -> 事件架构
- 部署 / K8s / 扩缩容 -> DevOps;监控 / 指标 / 告警 -> 性能与可观测性
- 常见组合:邮件队列栈(bullmq + 邮件系统 + redis)、后台处理栈(bullmq + backend + devops)、AI 处理流水线(bullmq + ai-workflow + 性能监控)、定时任务栈(bullmq + backend + redis)

---

采编自 sickn33/antigravity-awesome-skills(MIT)。

Attribution

findscripterfindscripter
View sourceSee grades on GitHubMore from findscripter →
SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments (0)

No comments yet. Be the first to comment!

SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Related Skills

Caveman

Terse caveman voice: answer first, fluff gone, every technical fact kept. Use for /caveman, "caveman mode", "talk like caveman", "be brief", "less tokens". Stays on until "stop caveman" or "normal mode".

1100021 votes

Hyperplan

Adversarial multi-agent planning skill. Self-orchestrates 5 hostile category members (unspecified-low, unspecified-high, deep, ultrabrain, artistry) via team-mode for ruthless cross-critique debate, distills only the defensible insights, then MANDATORILY hands the distilled insight bundle to the `plan` agent for executable plan formalization. Use when planning needs maximum rigor and surfacing of weak assumptions, blind spots, and over-engineering. Triggers: 'hyperplan', 'hpp', '/hyperplan', ...

698621 votes

Writing Skills

Create and manage Claude Code skills in HASH repository following Anthropic best practices. Use when creating new skills, modifying skill-rules.json, understanding trigger patterns, working with hooks, debugging skill activation, or implementing progressive disclosure. Covers skill structure, YAML frontmatter, trigger types (keywords, intent patterns), UserPromptSubmit hook, and the 500-line rule. Includes validation and debugging with SKILL_DEBUG. Examples include rust-error-stack, cargo-dep...

3931 votes

Mcp Code Execution

Routes multi-tool workflows through MCP servers for large datasets and pipelines. Use when Bash tool overhead is limiting throughput on data-heavy tasks.

3421 votes

catchup

Recovers the conversation and failed tool calls of a previous Codex, Amp, Claude Code, Antigravity, Cline, Copilot CLI, Cursor, DeepSeek Harness, Grok Build, Kimi, OpenCode, Pi Agent, or ZCode session. Use when the user says "catch up", "what did the last session do", "get me up to speed", "I switched agents", asks to recover/summarize a previous session before continuing, or asks to diagnose or report a catchup failure. Do NOT use for the current conversation, git history, or any non-agent log.

741 votes
View all in ai-agents →