Урок 01

Зачем нужен асинхронный бэкенд

Проблема синхронного подхода

Типичный Laravel-запрос:

Request → Router → Middleware → Controller → Service → DB/API → Response

Проблема: весь путь блокирующий. Если внешний API отвечает 3 секунды — PHP-FPM ждёт эти 3 секунды, ничего не делая.

Пример:

public function store(Request $request)
{
    $user = User::create($request->validated());

    $this->sendWelcomeEmail($user);      // 2 сек
    $this->generateAvatar($user);         // 3 сек
    $this->syncWithCrm($user);            // 5 сек

    return response()->json($user, 201);
    // Пользователь ждал 10 секунд
}

Что происходит:

  • 10 секунд — пользователь ушёл.
  • Timeout на балансировщике.
  • Упал CRM — вся регистрация сломалась.
  • 100 запросов = 1000 секунд работы.

Что такое асинхронность

Асинхронность — не ждать, пока операция завершится, а заниматься другими задачами.

Синхронно:

HTTP → операция (10 сек) → ответ

Асинхронно:

HTTP → задача в очередь → мгновенный ответ
         ↓
       Воркер → операция → готово

Три уровня асинхронности

1. Асинхронный код (одна операция):

// Плохо
$response = $this->http->get($url);   // блокирует

// Хорошо (через очередь)
FetchDataJob::dispatch($url);

2. Асинхронный runtime (несколько операций):

  • PHP-FPM — блокирующий. 100 процессов = 100 одновременных запросов.
  • Swoole / RoadRunner — event-loop, тысячи запросов.
  • Node.js — event-loop из коробки.

3. Асинхронная архитектура (сервисы):

  • Laravel + Node.js.
  • Очереди между сервисами.
  • WebSocket для real-time.

Когда нужна асинхронность

Долгие операции:

  • Вызов AI-модели (2–30 сек).
  • Отправка email / SMS / push.
  • Генерация PDF, ресайз картинок, транскод видео.
  • Внешние API (платежи, логистика, CRM).
  • Импорт / экспорт CSV на 100k строк.
  • Индексация поиска.

Все эти операции:

  • Не нужны пользователю прямо сейчас.
  • Могут упасть — нужен retry.
  • Могут подождать 5 минут.

Когда НЕ нужна

  • Чтение из БД — миллисекунды.
  • Ответ нужен сразу — синхронный API.
  • Маленькая нагрузка — простой сервер справится.
  • Критичный порядок — очередь может переставить.

Архитектура асинхронного приложения

Три кита:

  • Producer — кладёт задачу (Laravel).
  • Broker — хранит (Redis / RabbitMQ).
  • Consumer — выполняет (воркер).
Laravel → [Redis] → Laravel Worker
                 → Node.js Worker
                 → Python Worker

Что даёт:

  • Мгновенный HTTP-ответ.
  • Отказоустойчивость — retry.
  • Масштабирование — добавить воркеров.
  • Разделение — фронт ≠ фон.

Laravel + Node.js: зачем вместе

Laravel силён в:

  • ORM (Eloquent).
  • Очереди (Horizon).
  • Планировщик (Schedule).
  • Авторизация (Sanctum).
  • Валидация.

Node.js силён в:

  • WebSocket — тысячи соединений.
  • Real-time — мгновенная передача.
  • Высокий I/O — тысячи запросов.
  • CPU-задачи через worker_threads.

Вместе:

  • Laravel — бизнес-логика.
  • Node.js — real-time и I/O.
  • Redis — мост между ними.

Пример: чат с AI

Синхронно:

1. Пользователь пишет вопрос
2. Laravel → OpenAI (10 сек)
3. Ответ пользователю

Итого: 10 секунд ожидания

Асинхронно:

1. Пользователь пишет вопрос
2. Laravel → Redis → 201 Created (10 мс)
3. Worker → OpenAI (10 сек)
4. Ответ → Redis → Node.js → WebSocket → клиент

Итого: 10 мс до ответа, 10 сек до контента

Практика

Ответь на вопросы:

  1. Чем плоха синхронная отправка email в HTTP-запросе?
  2. Что такое producer, broker, consumer?
  3. Когда асинхронность не нужна?
  4. Зачем связка Laravel + Node.js?

Найди в своих проектах 3 места, где применима асинхронность.

Итог

  • Синхронно — быстро, но блокирует.
  • Асинхронно — мгновенный ответ, работа в фоне.
  • Producer → Broker → Consumer.
  • Laravel — бизнес-логика, Node.js — real-time.
  • Redis — мост.

Дальше — архитектура async-систем.