Laravel Queues
Agent Workflow (MANDATORY)
Before ANY implementation, use TeamCreate to spawn 3 agents:
- fuse-ai-pilot:explore-codebase - Analyze existing job patterns
- fuse-ai-pilot:research-expert - Verify Queue docs via Context7
- mcp__context7__query-docs - Check job and worker patterns
After implementation, run fuse-ai-pilot:sniper for validation.
Overview
| Component | Purpose |
|---|
| Jobs | Background tasks with retries, timeouts |
| Workers | Process jobs from queues |
| Batches | Group jobs with progress tracking |
| Chains | Sequential job execution |
| Middleware | Rate limiting, deduplication |
| Horizon | Redis queue monitoring dashboard |
Decision Guide: Queue Driver
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
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
- Use ShouldQueue for async processing
- Set tries and backoff for resilience
- Implement failed() method for error handling
- Use database transactions carefully with jobs
- Monitor with Horizon in production
Reference Guide
Concepts
Templates
Quick Reference
Basic Job
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
// 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