Архитектура системы
Система состоит из трёх основных слоёв: фронтенд, бэкенд-сервисы и инфраструктура.
- Фронтенд отвечает за UI редактора, подсветку синтаксиса и обновления в реальном времени
- Бэкенд управляет совместной работой, выполнением кода и контролем версий
- Инфраструктура предоставляет масштабируемые вычисления и хранилище
Совместная работа в реальном времени
Используй CRDT (Conflict-free Replicated Data Types) или Operational Transforms для синхронизации изменений между пользователями с минимальной задержкой.
- Каждый символ генерирует операцию, которая транслируется через WebSockets
- Операции объединяются без конфликтов, даже при плохих сетевых условиях
- Выделенный сервис совместной работы поддерживает состояние общего документа
Выполнение кода и песочница
Код должен выполняться в изолированных окружениях для предотвращения взлома.
- Используй контейнеры (например, Docker) или microVM (например, Firecracker) для каждой сессии выполнения
- Устанавливай строгие лимиты ресурсов — CPU, память и время выполнения
- Поддерживай несколько рантаймов, сохраняя образы контейнеров для каждого языка
- Результаты потоком отправляются клиенту через WebSocket для вывода терминала в реальном времени
Поддержка нескольких языков и функции редактора
- Подсветка синтаксиса на основе библиотек вроде
Monaco Editor или CodeMirror
- Языковые серверы (через
LSP) предоставляют автодополнение и диагностику ошибок
- Управление деревом файлов хранится в распределённой файловой системе или object storage
Интеграция с контролем версий
Git-операции (commit, push, pull, branch) проксируются
через бэкенд-сервис, подключённый к GitHub/GitLab API.
- Пользователи видят диффы и историю прямо в редакторе
- Ветвление и слияние обрабатываются на сервере, чтобы избежать сложности на клиенте
Масштабируемость и низкая задержка
- Разворачивай WebSocket-серверы за лоад-балансером со sticky sessions
- Используй Redis Pub/Sub для распространения событий реального времени между инстансами сервера
- Размещай ноды выполнения географически ближе к пользователям, чтобы минимизировать задержку туда-обратно