← Все проекты

Кейс · Go-бэкенд

Комнаты: чат и доска в реальном времени

Комнаты в реальном времени: чат с историей в SQLite, список «кто онлайн», индикатор «печатает», общая доска со штрихами и курсорами, анонимные ники. WebSocket (RFC 6455) написан на stdlib.

  • Go
  • WebSocket
  • SQLite
  • Canvas
  • Docker

01 · Как выглядит

Скриншоты

Скриншот проекта «Комнаты: чат и доска в реальном времени» на экране 1280 пикселей
Десктоп, 1280 px
Скриншот проекта «Комнаты: чат и доска в реальном времени» на экране телефона, 390 пикселей
Телефон, 390 px

02 · О проекте

Что это и зачем

Комнаты в реальном времени: чат с историей в SQLite, список «кто онлайн», индикатор «печатает» и общая доска, где штрихи и курсоры участников видны сразу всем. Вход без регистрации, ники анонимные.

Протокол WebSocket (RFC 6455) написан на стандартной библиотеке: рукопожатие, фреймы, маскирование, фрагментация, ping/pong и close-коды. Из зависимостей только SQLite на чистом Go, без CGO; интерфейс на ванильном JS и Canvas встроен в бинарник.

Ограничения

Один процесс, хаб живёт в памяти: горизонтального масштабирования нет. Доска хранится в памяти и не переживает перезапуск сервера (чат сохраняется в SQLite).

Нет TLS и аутентификации, ники анонимные и не защищены. Нет permessage-deflate; Autobahn Test Suite не запускался, корректность проверена собственными тестами.

Бот в демо-комнате отвечает заготовленными фразами и помечен как бот: это не человек и не ИИ.

Что внутри

  • Хаб комнат: на соединение две горутины, рассылка через ограниченную очередь; медленного клиента отключают, остальных он не задерживает
  • Лимиты частоты на соединение (токен-бакет для чата и общий), эфемерные сообщения (курсоры, «печатает») при перегрузке пропускаются
  • История чата в SQLite: сообщение рассылается только после записи, при входе отдаются последние 50, старые подгружаются постранично
  • Общая доска на Canvas: штрихи в нормализованных координатах, чужие курсоры с никами, состояние отдаётся вошедшим позже
  • Graceful shutdown: всем соединениям уходит close 1001; автореконнект в браузере с экспоненциальной паузой и джиттером
  • Тесты протокола и хаба, нагрузочный тест на 360 соединений в 6 комнатах; Docker и GitHub Actions

03 · Как запустить

Запуск одной командой

git clone <репозиторий по запросу> realtime-rooms
cd realtime-rooms
SEED_DEMO=1 go run ./cmd/server   # http://localhost:8086, комната /r/demo

04 · Код

Репозиторий приватный

Исходники лежат в приватном репозитории. Открою доступ по запросу: напишите, и пришлю приглашение.

Запросить код