mcpField
N
nestjs-queue-architect

nestjs-queue-architect

github.com/shipshitdevDevelopment38311 installsUpdated 2d ago
Repository

About nestjs-queue-architect

A software architecture skill for developers building BullMQ job-processing systems with NestJS, particularly for media-heavy workflows. It provides patterns for queue services, processors, retries, error handling, and cleanup.

Key features

  1. 01Structure queue services and processors
  2. 02Route jobs by name
  3. 03Configure retries and backoff
  4. 04Handle errors and clean up temporary files
  5. 05Apply idempotent job handlers

Use cases

  1. 01Design media-processing queues
  2. 02Implement retry behavior for jobs
  3. 03Organize job routing in NestJS
  4. 04Prevent temporary-file leaks during processing

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/shipshitdev/skills --skill nestjs-queue-architect

After installing, type/nestjs-queue-architectin Claude Code to confirm it loaded.

Bundled filesplugin.jsonreferences/full-guide.md

Details

From the project README

NestJS Queue Architect - BullMQ Expert

Design resilient, scalable BullMQ + NestJS job processing systems for media-heavy workflows.

Technology Stack

  • BullMQ: 5.61.0 (Redis-backed job queue)
  • @nestjs/bullmq: 12.0.0 (NestJS 12)
  • @bull-board/nestjs: 6.13.1 (Queue monitoring UI)

Project Context Discovery

Before implementing:

  1. Check .agents/memory/ for any architecture files describing queue patterns
  2. Review existing queue services and constants
  3. Look for [project]-queue-architect skill

Core Patterns

Queue Constants
export const QUEUE_NAMES = {
  VIDEO_PROCESSING: 'video-processing',
  IMAGE_PROCESSING: 'image-processing',
} as const;

export const JOB_PRIORITY = {
  HIGH: 1,    // User-facing
  NORMAL: 5,  // Standard
  LOW: 10,    // Background
} as const;
Queue Service
@Injectable()
export class VideoQueueService {
  constructor(@InjectQueue(QUEUE_NAMES.VIDEO) private queue: Queue) {}

  async addJob(data: VideoJobData) {
    return this.queue.add(JOB_TYPES.RESIZE, data, {
      priority: JOB_PRIORITY.NORMAL,
      attempts: 3,
      backoff: { type: 'exponential', delay: 2000 },
    });
  }
}
Processor (WorkerHost)
@Processor(QUEUE_NAMES.VIDEO)
export class VideoProcessor extends WorkerHost {
  async process(job: Job<VideoJobData>) {
    switch (job.name) {
      case JOB_TYPES.RESIZE: return this.handleResize(job);
      case JOB_TYPES.MERGE: return this.handleMerge(job);
      default: throw new Error(`Unknown job: ${job.name}`);
    }
  }
}

Key Principles

  1. One service per queue type - Encapsulate job options
  2. Switch-based routing - Route by job.name
  3. Structured error handling - Log, emit WebSocket, publish Redis, re-throw
  4. Always cleanup - Temp files in try/finally
  5. Idempotent handlers - Safe to retry

Queue Configuration

BullModule.registerQueue({
  name: QUEUE_NAMES.VIDEO,
  defaultJobOptions: {
    attempts: 3,
    backoff: { type: 'exponential', delay: 2000 },
    removeOnComplete: 100,  // Prevent Redis bloat
    removeOnFail: 50,
  },
});

Retry Strategy

Job TypeAttemptsDelayReason
Resize32000msTransient failures
Merge25000msResource-intensive
Metadata21000msFast, fail quickly
Cleanup51000msMust succeed

Common Pitfalls

  • Memory leaks: Always set removeOnComplete/Fail
  • Timeouts: Set appropriate timeout for heavy jobs
  • Race conditions: Make handlers idempotent

For complete processor examples, testing patterns, Bull Board setup, and Redis pub/sub integration, see: references/full-guide.md

Comments

Markdown supported