---
title: Queue Heavy Tasks — Never Block the Request Cycle
impact: HIGH
impactDescription: synchronous email/external API calls cause request timeouts and degrade user experience under load
tags: queues, jobs, email, performance, background, laravel
---

## Queue Heavy Tasks — Never Block the Request Cycle

Any task over ~200ms (sending email, calling external APIs, generating reports, processing images) must be dispatched to a queue, not executed synchronously in the HTTP request.

**Wrong:**

```php
// Request handler blocked for seconds
public function register(StoreUserRequest $request)
{
    $user = User::create($request->validated());

    // Blocks for 1-3 seconds — user waits, timeout risk
    Mail::to($user)->send(new WelcomeEmail($user));

    // Calls Slack API — blocks if Slack is slow
    Http::post(config('services.slack.webhook'), ['text' => "New user: {$user->email}"]);

    return response()->json($user, 201);
}
```

**Correct:**

```bash
php artisan make:job SendWelcomeEmail
php artisan make:job NotifySlackNewUser
```

```php
public function register(StoreUserRequest $request)
{
    $user = User::create($request->validated());

    // Dispatch to queue — returns immediately
    SendWelcomeEmail::dispatch($user)->onQueue('emails');
    NotifySlackNewUser::dispatch($user)->onQueue('notifications');

    return response()->json($user, 201); // responds in <50ms
}

// Job class
class SendWelcomeEmail implements ShouldQueue
{
    use Queueable, Dispatchable, InteractsWithQueue, SerializesModels;

    public function __construct(private User $user) {}

    public function handle(): void
    {
        Mail::to($this->user)->send(new WelcomeEmail($this->user));
    }

    public function failed(Throwable $e): void
    {
        Log::error('WelcomeEmail failed', ['user' => $this->user->id, 'error' => $e->getMessage()]);
    }
}
```

**Queue-worthy operations:** email, SMS, push notifications, Slack/webhook, PDF generation, image resize, CSV export, expensive calculations, third-party API calls.
