Skip to content

Laravel Reverb / Echo

Работал с Laravel Reverb и Laravel Echo как со связкой для пользовательских real-time сценариев внутри Laravel-приложения.

WebSocket позволяет встроить события реального времени в прикладной flow: фоновые задачи, обновление пользовательского состояния, уведомление о завершении операции, синхронизацию UI без постоянного polling.

Что использовал на практике

  • Laravel Reverb как self-hosted broadcasting server;
  • Laravel Echo на frontend для подписки на каналы и обработки событий;
  • private user-scoped каналы;
  • серверную авторизацию подписок;
  • ShouldBroadcastNow события для немедленной доставки;
  • явные имена событий через broadcastAs();
  • отдельные subscriber-классы на клиенте;
  • проксирование WebSocket-трафика через Nginx;
  • интеграцию realtime-событий с очередями и background jobs.

Backend-часть

В рабочих проектах настраивал broadcasting через Reverb как основной драйвер.

Базовая схема настройки:

  • конфигурация broadcasting с reverb-connection;
  • отдельная конфигурация config/reverb.php;
  • выделенный reverb сервис в docker-compose.yml;
  • набор broadcast events в app/Events/*.

Каналы и авторизация

Использовал private-каналы с привязкой к конкретному пользователю.

На практике это реализовывалось через каналы вида:

  • users.{userId}.exports;
  • users.{userId}.profile-changed;
  • users.{userId}.saved-recipes.

Авторизация подписки вынесена в отдельный channel authorizer, который проверяет, что пользователь может слушать только свои каналы.

Такой подход даёт:

  • изоляцию пользовательских событий;
  • предсказуемый channel naming;
  • более безопасную delivery-модель для персональных данных и статусов операций.

Broadcast events

Проектировал прикладные broadcast events для поддержания актуального состояния UI-клиента.

Примеры событий:

  • готовность PDF-экспорта;
  • изменение пользовательского профиля;
  • изменение сохранённых пользовательских сущностей.

Схема реализации:

  • использовать private channels для user-specific payload;
  • задать явное имя события через broadcastAs();
  • передать минимально необходимый payload;
  • связать событие с конкретным пользовательским сценарием в UI.

Echo на frontend

Laravel Echo использовал как отдельный клиентский слой.

Реализация в коде:

  • отдельная фабрика для создания Echo instance;
  • конфигурация через окружение и runtime-значения;
  • выделенные subscriber-классы под разные каналы;
  • раздельная обработка событий для export flow, profile updates и других пользовательских сценариев.

Такой подход удобен тем, что realtime-логика не размазывается по всему frontend-коду.

Reverb / Echo и фоновые задачи

Использовал связку очередей и realtime-доставки результата.

Пример асинхронного сценария PDF-экспорта:

  • клиент инициирует операцию по HTTP;
  • backend создаёт export job;
  • задача обрабатывается в очереди;
  • после завершения backend отправляет broadcast event;
  • frontend через Echo получает событие и завершает пользовательский flow.

Это хороший пример паттерна для длинных операций, где постоянный polling либо избыточен, либо ухудшает UX.

Инфраструктура и доставка

Realtime-слой разворачивается как отдельный процесс в Docker-инфраструктуре.

На практике использовал:

  • отдельный контейнер reverb;
  • проксирование пути /app через Nginx;
  • разделение PHP runtime, queue worker и realtime server по сервисам;
  • выделенной клиентской конфигурацией для подключения из браузера.

Что считаю важным в этом стеке

На практике считаю важными такие вещи:

  • realtime должен быть связан с конкретным пользовательским сценарием;
  • private channels и авторизация обязательны для персональных событий;
  • naming каналов и событий должен быть стабильным;
  • frontend-подписки лучше держать в явном subscriber-слое;
  • Reverb и Echo особенно хорошо работают в связке с очередями и async workflows.

Сайт обновлен и проверен: