Если ваш AI-чат показывает крутящийся спиннер, пока ответ генерируется целиком, а потом выбрасывает его одним куском — пользователь уже мысленно закрыл вкладку. Стриминг ответов LLM через WebSocket для AI чата или SSE решает эту проблему: текст появляется словом за словом, как в ChatGPT или Claude, и ощущение задержки исчезает почти полностью. Разберем пошагово, чем WebSocket отличается от SSE, как собрать чат на Socket.io, зачем вайбкодеру Supabase Realtime и какой стек выбрать под конкретную задачу.
Стриминг ответов нейросети через SSE проще в реализации и подходит для 80% AI-чатов, а WebSocket нужен только там, где клиент тоже постоянно шлет данные на сервер. Socket.io закрывает задачи с чатами и уведомлениями, Supabase Realtime — с коллаборативными фичами поверх базы данных. В статье — таблицы сравнения, код и реальные цены на 2026 год.
Зачем AI-чату нужен стриминг, а не спиннер загрузки?
Пользователь, который видит текст сразу после первого токена, воспринимает ответ как мгновенный, даже если полная генерация занимает 10-15 секунд. Спиннер без обратной связи создает ощущение зависшего приложения уже через 2-3 секунды.
Разница между loading-спиннером и потоковым ответом — это разница между «приложение висит» и «приложение работает». ChatGPT и Claude приучили пользователей к тому, что текст печатается на глазах. Любой AI-продукт без стриминга сегодня выглядит устаревшим уже на старте.
Дело не только в психологии восприятия. Пока модель генерирует токены, сервер и так получает их по частям от провайдера. Раньше эти данные накапливали в буфере и отправляли клиенту целиком после завершения. Сейчас — от Claude Sonnet 4.6 до DeepSeek V4 и Gemini 3.1 Pro — все крупные API отдают ответ chunk-ами через тот же стриминговый протокол, что используют SSE и WebSocket. Задача разработчика — просто не терять эти chunk-и по дороге к браузеру, а сразу прокидывать их дальше.
Отдельный плюс для вайбкодера: возможность остановить генерацию на середине. Пользователь передумал, закрыл вкладку или задал уточняющий вопрос — соединение можно разорвать, не дожидаясь конца ответа, и не платить за токены, которые никто не прочитает.

WebSocket или SSE что выбрать для AI-приложения?
Для одностороннего стриминга ответов LLM почти всегда достаточно SSE — он проще, работает поверх обычного HTTP и сам переподключается при обрыве. WebSocket нужен, только если клиент должен слать данные на сервер так же часто, как получать.
SSE и WebSocket решают разные задачи. SSE — это труба «сервер → клиент», WebSocket — двусторонняя магистраль. Для AI-чата, где пользователь печатает сообщение раз в 10-20 секунд, а ответ льется непрерывно, SSE почти всегда выигрывает по простоте внедрения.
Технически SSE — часть протокола HTTP, поэтому браузер обрабатывает переподключение автоматически, без дополнительного кода. У WebSocket такой логики из коробки нет: обрыв связи придется ловить и переподключаться руками. Зато WebSocket передает не только текст, но и бинарные данные, а канал остается открытым в обе стороны без задержек на каждый запрос.

| Критерий | SSE | WebSocket |
|---|---|---|
| Направление | Сервер → клиент | Двустороннее |
| Протокол | Обычный HTTP | Апгрейд до отдельного протокола |
| Тип данных | Только текст (UTF-8) | Текст и бинарные данные |
| Переподключение | Встроено в браузер | Нужно писать самому |
| Сложность внедрения | Низкая | Средняя-высокая |
| Лимит соединений | 6-8 на HTTP/1.1, снимается HTTP/2 | Один сокет на клиента, лимит не критичен |
| Типовой кейс | Стриминг ответа LLM, уведомления, прогресс-бар | Чат, коллаборативный редактор, игра |
Один нюанс, который редко упоминают в туториалах: на HTTP/1.1 браузер держит не больше 6-8 одновременных TCP-соединений к одному хосту, и несколько открытых SSE-вкладок этот лимит быстро выедают. HTTP/2 с мультиплексированием потоков снимает проблему полностью, поэтому для продакшена стоит сразу поднимать сервер с поддержкой HTTP/2.
Как настроить SSE стриминг ответов LLM по частям?
Сервер отвечает заголовком Content-Type: text/event-stream, а каждый chunk от AI-провайдера сразу же уходит клиенту в формате data: <текст>\n\n. Браузер читает поток через встроенный EventSource API без дополнительных библиотек.
На .NET 10, Node.js или любом другом стеке принцип одинаковый: получаем chunk от модели, тут же пишем его в ответ, не дожидаясь остальных. Задержка между генерацией токена и его показом на экране — миллисекунды.
Минимальный сценарий выглядит так. Клиент открывает соединение через new EventSource('/api/chat-stream'). Сервер на каждый chunk от LLM (будь то Claude, GPT-5.4 или локальная модель через Ollama) пишет строку в формате SSE и сразу флашит поток — без буферизации. Клиент подписывается на событие message и дописывает пришедший текст в DOM по мере поступления.

Отдельно стоит продумать кнопку «стоп»: она должна закрывать HTTP-соединение на клиенте и параллельно отменять запрос к AI-провайдеру на сервере, иначе генерация продолжится вхолостую и вы заплатите за токены, которые никто не увидит. Для локальной разработки без затрат на API удобно гонять поток через Ollama — принцип стриминга там идентичен облачным провайдерам, только цена нулевая.
Как собрать чат в реальном времени на Socket.io?
Socket.io добавляет к WebSocket событийную модель: клиент и сервер обмениваются именованными событиями через emit и on, а сервер может рассылать сообщения сразу всем подключенным клиентам через broadcast.
Главное отличие Socket.io от чистого WebSocket API — событийная модель. Вместо разбора сырых сообщений вы просто слушаете событиеsend_messageи отвечаете событиемreceive_message. Это сокращает код чата в 2-3 раза по сравнению с ручным WebSocket.
Базовая архитектура чата на Socket.io обычно включает: Express-сервер как точку входа, слой событий join, send_message, load_messages со стороны клиента и receive_message, status_update со стороны сервера, плюс хранилище истории — от простого JSON-файла до PostgreSQL через Sequelize. При подключении нового пользователя сервер сразу отдает накопленную историю сообщений, чтобы человек видел контекст, а не пустой экран.
Для отладки Socket.io есть удобный трюк: клиентская библиотека всегда доступна по пути /socket.io/socket.io.js прямо с работающего сервера, что упрощает диагностику без сборки фронтенда. А для разработки полезно поставить nodemon, чтобы сервер сам перезапускался при изменениях кода и не приходилось гонять команду руками.
Что важно не забыть при сохранении истории чата
Если сервер перезапускается или падает, история чата не должна теряться. Рабочий паттерн — перехватывать сигнал SIGINT перед завершением процесса и синхронно дописывать накопленные сообщения в файл или базу. Без этого шага любой рестарт деплоя обнуляет переписку пользователей, и это первое, на чём спотыкаются новички при первом запуске в продакшен.

Когда WebSocket избыточен и хватит обычного polling?
Если данные меняются непредсказуемо редко или клиенту нужен только pull без постоянной мутации, long polling масштабируется на несколько серверов проще и дешевле, чем WebSocket с его stateful-соединениями.
WebSocket сложно горизонтально масштабировать именно из-за состояния соединения: сессия привязана к конкретному серверу, и балансировщик нагрузки должен об этом знать. Polling в этом смысле честнее — каждый запрос независим и легко уходит на любой сервер за load balancer.
Разработчики, которые сравнивали три подхода на реальных нагрузках, ставят polling на первое место по частоте использования, а SSE на последнее — просто потому, что polling проще интегрировать в существующую инфраструктуру без выделенного WebSocket-слоя. Для биржевых котировок или ленты новостей short polling раз в несколько секунд иногда работает не хуже постоянного соединения, но при этом на порядок проще в эксплуатации.
Правило простое: если приложению нужен настоящий full-duplex (обе стороны говорят одновременно и часто) — берите WebSocket. Если нужен только push от сервера — SSE. Если данные меняются редко и непредсказуемо, а инфраструктура и так работает через обычные REST-эндпоинты — long polling закроет задачу без новой инфраструктуры.
Что такое Supabase Realtime и зачем он вайбкодеру?
Supabase Realtime — надстройка над PostgreSQL с четырьмя механизмами: Postgres Changes (подписка на изменения в таблице), Broadcast (произвольные события без записи в базу), Presence (кто сейчас онлайн) и Broadcast через database-триггеры для сложной логики.
Postgres Changes отслеживает изменения прямо в таблице и уважает политики Row Level Security — это упрощает настройку доступа. Broadcast не привязан к базе вообще и подходит для того, что не нужно хранить постоянно, например позиции курсора в коллаборативном редакторе.
Для live-дашбордов логичнее всего Postgres Changes: подписался на таблицу заказов — и фронтенд обновляется при каждой новой записи без единой строчки собственного WebSocket-кода. Для коллаборативных редакторов (курсоры, кто что печатает) лучше Broadcast — задержка ниже, потому что данные не проходят через диск. Presence решает задачу «кто сейчас онлайн», сохраняя ID пользователя как ключ состояния канала.
Продвинутый сценарий — Broadcast с триггерами базы данных: вы пишете сложную логику прямо в PostgreSQL-триггере, а результат транслируется через Realtime уже без нагрузки на клиентский код. Отдельный параметр send_limit позволяет повторно отправить сообщения клиенту с нестабильным интернетом при переподключении, что критично для мобильных пользователей.
Сколько стоит Supabase Realtime в 2026 году?
Бесплатный тариф Supabase держит до 200 одновременных realtime-соединений и 2 млн сообщений в месяц — этого хватает для MVP. Pro-план за $25/мес поднимает лимит до 500 соединений, а дальше платите по $10 за каждую следующую тысячу.
По данным официальной документации Supabase, за каждый миллион realtime-сообщений сверх квоты берут $2.5, а за каждую тысячу пиковых подключений сверх лимита — $10. Здесь легко ошибиться в расчетах: каждый подписанный клиент считается отдельно на каждое доставленное сообщение, поэтому дашборд со 100 одновременными зрителями умножает счетчик событий на 100.

| Тариф | Цена | Realtime-соединения | Сообщения/мес |
|---|---|---|---|
| Free | $0 | ~200 одновременных | 2 млн |
| Pro | $25/мес + usage | 500, далее $10/1000 | 5 млн, далее $2.5/1М |
| Team | $599/мес + usage | как Pro + SOC2/ISO 27001 | как Pro |
| Enterprise | по запросу | кастомно | кастомно |
Для типичного MVP на 10 000 пользователей с пиком в 200-300 одновременных подключений тарифа Pro за $25 в месяц обычно достаточно. Проблемы начинаются при 1000+ одновременных соединений — здесь либо переходить на Team, либо разворачивать self-hosted Realtime на своей инфраструктуре, благо движок построен на Elixir/Phoenix и способен держать сотни тысяч сокетов на одном сервере. Актуальные цифры перед запуском стоит сверять на странице тарифов Supabase, потому что лимиты периодически пересматривают.
Socket.io или Supabase Realtime что выбрать под задачу?
Socket.io выигрывает там, где нужна произвольная событийная логика и полный контроль над сервером. Supabase Realtime быстрее внедрить, если данные и так лежат в PostgreSQL и не хочется поднимать отдельный WebSocket-сервер.
Итоговый выбор стека почти всегда сводится к трём вопросам: откуда берутся данные, нужен ли полный контроль над сервером и сколько времени есть на разработку. Ниже — карта решений под типовые задачи вайбкодера.
| Задача | Рекомендуемый стек |
|---|---|
| Стриминг ответа LLM в чат | SSE (EventSource + backend-роут) |
| Приватный чат между пользователями | Socket.io + своя БД |
| Live-дашборд метрик из базы данных | Supabase Realtime (Postgres Changes) |
| Коллаборативный редактор, курсоры | Supabase Realtime (Broadcast) или Socket.io rooms |
| Кто сейчас онлайн в канале | Supabase Realtime (Presence) |
| Уведомления о новых заказах | SSE или Postgres Changes |
| Редкие непредсказуемые обновления, простая инфраструктура | Long polling |
Если проект уже строится на Supabase как основной базе данных, добавить Realtime — это буквально одна подписка на канал, без нового сервера. Если данные не в Supabase или нужна собственная бизнес-логика на каждое событие, Socket.io дает больше свободы, но и требует поддерживать отдельный процесс.

Максим: «Веб-версию GoBanana мы собрали за 3 часа после выхода новой модели, а весь продукт с нуля — за 6-8 часов. Принес 12 млн рублей. Если бы тогда закладывали неделю на выбор идеального real-time стека, не успели бы поймать момент. Берите SSE или Supabase Realtime как дефолт и не усложняйте, пока реально не упретесь в лимиты.»
Какие ошибки чаще всего убивают real-time AI-проект?
Самые частые провалы: забытая логика переподключения WebSocket, использование service role key на клиенте и отсутствие сохранения состояния при перезапуске сервера.
Первая ошибка — понадеяться, что WebSocket переподключится сам, как SSE. Не переподключится: без явной обработки обрыва связи пользователь просто перестанет получать сообщения и не поймет почему. Вторая — хранить service role key от Supabase в клиентском коде: этот ключ игнорирует все политики безопасности RLS и открывает полный доступ к базе кому угодно, кто откроет DevTools.
Третья ошибка — не думать о выключении сервера заранее. При деплое или падении процесса несохраненная история чата или состояние сессии пропадает безвозвратно, если не перехватывать сигнал завершения и не писать данные асинхронно перед выходом. И последняя, менее очевидная: открывать по отдельному SSE-соединению на каждый виджет страницы на HTTP/1.1 — упретесь в лимит браузера на 6-8 подключений быстрее, чем ожидаете.

Итог: с чего начать стриминговое AI-приложение прямо сейчас?
Начните с SSE для стриминга ответов LLM — это самый быстрый путь получить эффект «печатает как ChatGPT» без лишней инфраструктуры. Если параллельно нужен чат между пользователями, добавляйте Socket.io. Если проект и так строится вокруг PostgreSQL и Supabase, для дашбордов и коллаборативных фич берите Realtime вместо отдельного WebSocket-сервера — это экономит недели разработки.
Честно: сам портал VibeCoderz пока не стримит AI-ответы в реальном времени, мы делимся стеком, который тестировали в собственных и клиентских проектах вроде GoBanana и NeuroScribe. Для написания кода стриминга удобно работать в Cursor или Claude Code — оба хорошо держат контекст многофайловых WebSocket/SSE-проектов, а для быстрого прототипа с готовым UI подойдет Windsurf. Если запускаете AI-агента, которому тоже нужны потоковые ответы, загляните в каталог агентов по нишам — там собраны готовые промпт-сетапы под конкретные задачи.
Глоссарий
- WebSocket — протокол постоянного двустороннего соединения между браузером и сервером поверх TCP.
- SSE (Server-Sent Events) — стандарт HTTP для одностороннего потока данных от сервера к клиенту.
- EventSource API — встроенный в браузер JavaScript-интерфейс для чтения SSE-потока без сторонних библиотек.
- Socket.io — библиотека поверх WebSocket с событийной моделью (
emit/on) и автоматическим фолбэком на polling. - Supabase Realtime — сервис на Elixir/Phoenix для подписки на изменения в PostgreSQL и произвольные события.
- Presence — механизм Supabase Realtime для отслеживания, какие пользователи сейчас подключены к каналу.
- RLS (Row Level Security) — политики PostgreSQL, ограничивающие доступ к строкам таблицы на уровне пользователя.
- Long polling — клиент держит HTTP-запрос открытым, пока сервер не пришлет новые данные или не истечет таймаут.
- Full-duplex — режим связи, при котором обе стороны отправляют данные одновременно, без ожидания очереди.
Частые вопросы про WebSocket и стриминг AI-ответов
Что проще внедрить новичку — WebSocket или SSE?
SSE. Он работает поверх обычного HTTP, браузер сам переподключается при обрыве, а код на сервере сводится к правильным заголовкам и построчной отправке данных. WebSocket требует больше ручной работы с состоянием соединения.
Можно ли стримить ответы Claude или GPT через SSE?
Да. Все крупные AI-провайдеры отдают ответ chunk-ами через тот же механизм стриминга, что использует SSE. Задача backend-кода — не буферизовать эти chunk-и, а сразу пересылать их клиенту по мере поступления.
Сколько стоит Supabase Realtime для чата на 1000 пользователей?
Зависит от пиковых одновременных подключений, а не от общего числа пользователей. Если одновременно онлайн 200-300 человек, хватает тарифа Pro за $25 в месяц. При росте до 1000+ одновременных соединений придется доплачивать за превышение или переходить на Team.
Нужен ли отдельный сервер для WebSocket или хватит serverless-хостинга типа Vercel?
Классический serverless плохо держит долгоживущие WebSocket-соединения, потому что функции завершаются после ответа. Нужен постоянно работающий процесс — VPS, Railway, Render или managed-решение вроде Supabase Realtime, которое уже развернуто как отдельный сервис.
Что делать, если WebSocket-соединение постоянно обрывается?
Реализовать вручную логику переподключения с экспоненциальной задержкой между попытками и хранить на клиенте очередь неотправленных сообщений. У SSE эта логика встроена в браузер, поэтому для нестабильных сетей его иногда выбирают именно из-за надежности переподключения.
Подходит ли Socket.io для AI-чата с потоковыми ответами?
Подходит, но избыточен, если нужен только вывод ответа модели. Socket.io имеет смысл, когда, кроме стриминга ответа, есть полноценный чат между людьми, статусы онлайн/офлайн или обмен файлами — то есть двусторонняя логика сверх самого AI-ответа.
Как масштабировать WebSocket на несколько серверов?
Через sticky sessions на балансировщике нагрузки или общий pub/sub слой (Redis, NATS), который синхронизирует сообщения между инстансами сервера. Именно из-за этой сложности многие вайбкодеры на старте выбирают Supabase Realtime или SSE вместо самописного WebSocket-кластера.
Хотите разобрать архитектуру своего AI-продукта и выбрать стек под конкретную задачу? Записывайтесь на консультацию к Максиму: t.me/maxnagovitsyn. А полный каталог AI-инструментов для вайбкодинга — на vibecoderz.ru/ide.
Обновлено: август 2026.