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


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/demo04 · Код
Репозиторий приватный
Исходники лежат в приватном репозитории. Открою доступ по запросу: напишите, и пришлю приглашение.
Запросить код