nestjs-queue-architect について
NestJS と BullMQ を使ったジョブ処理システムを構築する開発者向けの設計スキルです。特にメディア処理の多いワークフローを対象に、キューサービス、プロセッサー、再試行、エラー処理、クリーンアップのパターンを扱います。
主な機能
- 01キューサービスとプロセッサーの構成
- 02ジョブ名による振り分け
- 03再試行とバックオフの設定
- 04エラー処理と一時ファイルの削除
- 05冪等なジョブハンドラーの適用
活用シーン
- 01メディア処理キューの設計
- 02ジョブの再試行動作の実装
- 03NestJS でのジョブルーティング整理
- 04処理中の一時ファイル残留の防止
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ shipshitdev/ skills --skill nestjs-queue-architectインストール後、Claude Code で/nestjs-queue-architectを入力して読み込まれたか確認します。
同梱ファイルplugin.jsonreferences/full-guide.md
詳細
NestJS Queue Architect - BullMQ エキスパート
メディアを多用するワークフロー向けに、堅牢でスケーラブルな BullMQ + NestJS ジョブ処理システムを設計します。
技術スタック
- BullMQ: 5.61.0(Redis ベースのジョブキュー)
- @nestjs/bullmq: 12.0.0(NestJS 12)
- @bull-board/nestjs: 6.13.1(キュー監視 UI)
プロジェクトコンテキストの確認
実装する前に、以下を確認します。
.agents/memory/にキューパターンを説明するアーキテクチャファイルがあるか確認します- 既存のキューサービスと定数を確認します
[project]-queue-architectスキルを探します
コアパターン
キュー定数
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;
キューサービス
@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 },
});
}
}
プロセッサー(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}`);
}
}
}
主な原則
- キューの種類ごとにサービスを1つ用意する - ジョブオプションをカプセル化します
- switch ベースのルーティング -
job.nameによってルーティングします - 構造化されたエラー処理 - ログを記録し、WebSocket イベントを送信し、Redis にパブリッシュしてから再スローします
- 必ずクリーンアップする - 一時ファイルは try/finally で処理します
- 冪等なハンドラー - 安全に再試行できるようにします
キューの設定
BullModule.registerQueue({
name: QUEUE_NAMES.VIDEO,
defaultJobOptions: {
attempts: 3,
backoff: { type: 'exponential', delay: 2000 },
removeOnComplete: 100, // Prevent Redis bloat
removeOnFail: 50,
},
});
再試行戦略
| ジョブタイプ | 試行回数 | 遅延 | 理由 |
|---|---|---|---|
| リサイズ | 3 | 2000ms | 一時的な障害 |
| マージ | 2 | 5000ms | リソース負荷が高い |
| メタデータ | 2 | 1000ms | 処理が速いため、早めに失敗させる |
| クリーンアップ | 5 | 1000ms | 成功させる必要がある |
よくある落とし穴
- メモリリーク:
removeOnComplete/Failを必ず設定します - タイムアウト:負荷の高いジョブには適切な
timeoutを設定します - 競合状態:ハンドラーを冪等にします
プロセッサーの完全な例、テストパターン、Bull Board の設定、Redis pub/sub の統合については、こちらを参照してください: references/full-guide.md
コメント
Markdown 対応