AgentSkillsCN

laravel-queues

使用队列、工作者、批次、链条、中间件及失败处理实现后台任务。适用于处理异步任务或长时间运行的操作时使用。

SKILL.md
--- frontmatter
name: laravel-queues
description: Implement background jobs with queues, workers, batches, chains, middleware, and failure handling. Use when processing async tasks or handling long-running operations.
versions:
  laravel: "12.46"
  horizon: "5.43"
  php: "8.5"
user-invocable: false
references: references/jobs.md, references/dispatching.md, references/workers.md, references/batching.md, references/chaining.md, references/middleware.md, references/failed-jobs.md, references/horizon.md, references/testing.md, references/troubleshooting.md, references/templates/QueueableJob.php.md, references/templates/BatchJob.php.md, references/templates/ChainedJobs.php.md, references/templates/JobMiddleware.php.md, references/templates/JobTest.php.md
related-skills: laravel-architecture, laravel-eloquent

Laravel Queues

Agent Workflow (MANDATORY)

Before ANY implementation, use TeamCreate to spawn 3 agents:

  1. fuse-ai-pilot:explore-codebase - Analyze existing job patterns
  2. fuse-ai-pilot:research-expert - Verify Queue docs via Context7
  3. mcp__context7__query-docs - Check job and worker patterns

After implementation, run fuse-ai-pilot:sniper for validation.


Overview

ComponentPurpose
JobsBackground tasks with retries, timeouts
WorkersProcess jobs from queues
BatchesGroup jobs with progress tracking
ChainsSequential job execution
MiddlewareRate limiting, deduplication
HorizonRedis queue monitoring dashboard

Decision Guide: Queue Driver

code
Which driver?
├── Development → sync (instant execution)
├── Small app → database (simple, no Redis)
├── Production → redis (fast, Horizon support)
├── AWS → sqs (managed, scalable)
└── High volume → redis + Horizon (monitoring)

Decision Guide: Job Design

code
Job type?
├── Simple async → Standard Job
├── Group processing → Batch (progress, cancel)
├── Sequential steps → Chain (A → B → C)
├── Rate limited → Middleware + RateLimiter
├── Unique execution → UniqueJob / WithoutOverlapping
└── Long running → Timeout + Retry settings

Critical Rules

  1. Use ShouldQueue for async processing
  2. Set tries and backoff for resilience
  3. Implement failed() method for error handling
  4. Use database transactions carefully with jobs
  5. Monitor with Horizon in production

Reference Guide

Concepts

TopicReferenceWhen to Consult
Jobsjobs.mdCreating job classes
Dispatchingdispatching.mdSending jobs to queues
Workersworkers.mdRunning queue workers
Batchingbatching.mdGrouping jobs
Chainingchaining.mdSequential jobs
Middlewaremiddleware.mdRate limiting, dedup
Failed Jobsfailed-jobs.mdError handling
Horizonhorizon.mdMonitoring dashboard
Testingtesting.mdJob testing
Troubleshootingtroubleshooting.mdCommon issues

Templates

TemplateWhen to Use
QueueableJob.php.mdStandard job with retries
BatchJob.php.mdBatchable job
ChainedJobs.php.mdJob chain implementation
JobMiddleware.php.mdCustom middleware
JobTest.php.mdTesting jobs

Quick Reference

Basic Job

php
final class ProcessOrder implements ShouldQueue
{
    use Queueable;

    public int $tries = 3;
    public int $backoff = 60;
    public int $timeout = 120;

    public function __construct(
        public readonly Order $order,
    ) {}

    public function handle(OrderService $service): void
    {
        $service->process($this->order);
    }

    public function failed(\Throwable $e): void
    {
        Log::error('Order failed', ['id' => $this->order->id]);
    }
}

Dispatch

php
// Immediate
ProcessOrder::dispatch($order);

// Delayed
ProcessOrder::dispatch($order)->delay(now()->addMinutes(5));

// On specific queue
ProcessOrder::dispatch($order)->onQueue('orders');

Best Practices

DO

  • Use final for job classes
  • Implement failed() method
  • Set appropriate timeout values
  • Use Unique for one-at-a-time jobs
  • Monitor with Horizon in production

DON'T

  • Dispatch inside database transactions (use afterCommit)
  • Store large objects in job properties
  • Forget to handle failures
  • Use sync driver in production