Зачем нужен асинхронный бэкенд
Проблема синхронного подхода
Типичный 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 сек до контента
Практика
Ответь на вопросы:
- Чем плоха синхронная отправка email в HTTP-запросе?
- Что такое producer, broker, consumer?
- Когда асинхронность не нужна?
- Зачем связка Laravel + Node.js?
Найди в своих проектах 3 места, где применима асинхронность.
Итог
- Синхронно — быстро, но блокирует.
- Асинхронно — мгновенный ответ, работа в фоне.
- Producer → Broker → Consumer.
- Laravel — бизнес-логика, Node.js — real-time.
- Redis — мост.
Дальше — архитектура async-систем.