В нашей практике типовой интернет-магазин на Битрикс обновляет остатки в корзине с запаздыванием 2-5 секунд. Покупатель добавляет товар, а система ещё не пересчитала доступность. Через час приходит письмо: «товара нет в наличии». WebSocket решает эту проблему, поддерживая постоянное соединение и доставляя данные мгновенно. Push-уведомления для интернет-магазина — один из ключевых сценариев, который мы реализуем. WebSocket — стандарт двунаправленной связи (Wikipedia). Мы предлагаем выбрать правильную архитектуру: Centrifugo, Ratchet или Node.js. Разберём, что и когда выбрать, и как интегрировать без головной боли.
Почему не polling?
Вместо того чтобы браузер каждые N секунд спрашивать "есть ли новые данные?", WebSocket держит одно постоянное соединение. При 100 одновременных пользователях и интервале 5 секунд polling создаёт 20 запросов в секунду — большинство пустых. WebSocket отправляет данные только когда они появляются, снижая нагрузку на сервер в 10-15 раз и экономя до 40% серверных ресурсов. Long polling — компромисс, но хуже масштабируется и потребляет больше памяти. На практике WebSocket обрабатывает до 10 000 одновременных соединений на одном сервере без потери производительности.
Какой WebSocket-сервер выбрать для Битрикс?
Выбор стека определяет скорость разработки и стоимость поддержки. Ниже — сравнение трёх подходов без маркетинговых обещаний.
Сравнение технологий
| Критерий | Centrifugo | Ratchet | Node.js + Socket.io |
|---|---|---|---|
| Готовность к продакшену | Высокая (из коробки) | Средняя (требуется доработка) | Высокая (экосистема готова) |
| Гибкость кастомизации | Низкая (через API) | Высокая (полный контроль) | Средняя (экосистема) |
| Производительность (соединений) | ~50 000 | ~5 000 | ~100 000 |
| Сложность интеграции | Низкая (2-3 дня) | Средняя (1-2 недели) | Средняя (1-2 недели) |
| Поддержка PHP | Через HTTP API | Напрямую (PHP) | Через Redis |
Centrifugo подходит для быстрого старта: готовый сервер с авторизацией каналов, историей сообщений и масштабированием. Вы получаете production-ready решение за пару дней, но меньше гибкости — нужно адаптироваться к API. Ratchet, наоборот, даёт полный контроль: вы пишете логику соединений на PHP, интегрируетесь напрямую с Битрикс. Минус — придётся реализовывать авторизацию и обработку ошибок вручную. Node.js + Socket.io — для высоконагруженных проектов с тысячами соединений. Это отдельный стек, интеграция через Redis pub/sub, но производительность выше в 2-3 раза по сравнению с Ratchet.
Для типового интернет-магазина на 200 заказов в день достаточно Centrifugo. Если нужен сложный чат с историей и модерацией — выбираем Node.js. При ограниченном бюджете и полной кастомизации — Ratchet. Опыт показывает, что правильный выбор снижает стоимость владения на 40%.
Архитектура с Centrifugo
Centrifugo — отдельный сервис, Битрикс взаимодействует с ним через HTTP API:
Браузер ←→ WebSocket ←→ Centrifugo ←→ Redis ↑ Битрикс публикует события При событии в Битрикс (новый заказ, изменение статуса) — PHP-код публикует в канал Centrifugo:
$centrifugo = new CentrifugoClient('http://centrifugo:8000', $apiKey); $centrifugo->publish('orders:' . $managerId, [ 'event' => 'new_order', 'order_id' => $orderId, 'customer' => $customerName, 'amount' => $amount, ]); Браузер, подписанный на канал orders:{managerId}, мгновенно получает событие. Авторизация каналов через JWT — Centrifugo проверяет права через эндпоинт Битрикс.
Архитектура с Ratchet
Для более тесной интеграции — собственный WebSocket-сервер на Ratchet. Запускается как daemon:
php /local/cli/websocket_server.php // websocket_server.php use Ratchet\Server\IoServer; use Ratchet\Http\HttpServer; use Ratchet\WebSocket\WsServer; $server = IoServer::factory( new HttpServer( new WsServer( new BitrixWebSocketHandler() ) ), 8080 ); $server->run(); BitrixWebSocketHandler реализует \Ratchet\MessageComponentInterface:
-
onOpen— новое соединение, авторизация -
onMessage— сообщение от клиента -
onClose— закрытие -
onError— ошибка
Хранение соединений: SplObjectStorage с привязкой user_id → connection. Связь с Битрикс через Redis pub/sub — Битрикс публикует, Ratchet читает и рассылает.
Как интегрировать WebSocket с Битрикс?
Интеграция состоит из нескольких шагов. Разберём на примере Centrifugo — самого частого выбора.
- Установка и настройка Centrifugo. Запускаем Docker-контейнер, указываем API-ключ и секрет для JWT.
- Настройка авторизации. В Битрикс создаём эндпоинт, который возвращает JWT-токен для текущего пользователя. Centrifugo проверяет токен при каждом подключении.
- Публикация событий. В обработчиках событий Битрикс (например,
OnOrderAdd) вызываем HTTP API Centrifugo для публикации в нужный канал. - Frontend-клиент. Подключаемся по WebSocket, передаём токен, подписываемся на каналы и обрабатываем сообщения.
- Деплой с Supervisor и Nginx. Обеспечиваем автозапуск и проксирование.
Frontend: подключение к WebSocket
const ws = new WebSocket('wss://example.com:8080'); ws.onopen = () => { ws.send(JSON.stringify({ type: 'auth', token: userJwt })); }; ws.onmessage = (event) => { const data = JSON.parse(event.data); if (data.event === 'new_order') { showNotification(`Новый заказ #${data.order_id} на ${data.amount} $`); } }; ws.onclose = () => { setTimeout(() => connectWebSocket(), 3000); }; Переподключение с exponential backoff — обязательно. Мобильные сети нестабильны.
Что входит в работу
- Анализ сценариев и выбор технологии
- Настройка WebSocket-сервера (Centrifugo/Ratchet/Node.js)
- Интеграция с Битрикс через Redis pub/sub
- Разработка frontend-клиента (JS, авторизация, переподключение)
- Деплой с Supervisor и Nginx
- Мониторинг метрик соединений
- Документация по архитектуре и поддержке
Этапы разработки
| Этап | Содержание | Срок |
|---|---|---|
| Выбор технологии | Centrifugo vs Ratchet vs Node.js, оценка инфраструктуры | 2–3 дня |
| WebSocket-сервер | Базовая инфраструктура, авторизация | 1 неделя |
| Интеграция с Битрикс | Redis pub/sub, публикация событий из PHP | 3–5 дней |
| Frontend-клиент | JS-клиент, переподключение, обработка событий | 3–5 дней |
| Конкретные сценарии | Уведомления, чат, обновление данных | 1–2 недели |
| Деплой и мониторинг | Supervisor, Nginx, метрики соединений | 3–5 дней |
Когда WebSocket оправдан?
WebSocket оправдан там, где задержка в несколько секунд критична для UX. Для уведомлений, которые можно показать при следующем переходе по странице, — избыточно. Оценим ваш проект бесплатно — просто свяжитесь с нами.
Для ускорения выбора: если у вас до 1000 одновременных соединений и типовые сценарии (уведомления, обновление корзины) — выбирайте Centrifugo. Если нужен кастомный протокол или интеграция с PHP-логикой — Ratchet. Для масштабных чатов и коллабораций — Node.js. Получите консультацию нашего инженера — поможем спроектировать архитектуру.







