В современном мире разработки программного обеспечения скорость и актуальность информации играют решающую роль. Особенно это критично в процессах непрерывной интеграции и доставки, где своевременное отображение статусов сборок и тестов помогает командам оперативно реагировать на изменения и ошибки. GitLab, как одна из популярных платформ для DevOps, всегда стремился к повышению эффективности своих сервисов. Недавно компания совершила значительный технологический прорыв, отказавшись от устаревшего метода опроса (polling) в пользу внедрения WebSockets через GraphQL подписки, тем самым существенно улучшив пользовательский опыт и снизив нагрузку на серверы. Долгое время многие системы в DevOps сфере опирались на polling для получения обновлений в реальном времени.
Этот метод предполагал регулярные запросы к серверу с определённым интервалом, например, каждые 30 секунд. Несмотря на кажущуюся простоту, такое решение было далеко не оптимальным. Оно создавало избыточный сетевой трафик, так как запросы приходилось отправлять даже в случае отсутствия изменений. Кроме того, при больших масштабах и значительном числе пользователей подобный подход приводил к серьёзной нагрузке на инфраструктуру и замедлению реакции интерфейса. Переломным моментом для GitLab стала необходимость улучшить опыт пользователей, столкнувшихся с задержками в обновлении статусов CI/CD заданий.
Ранее в интерфейсе, например, на странице с логами сборки, информация о статусе проекта обновлялась с помощью polling - клиент повторно запрашивал сервер каждые 30 секунд. По данным внутренней аналитики, это приводило к миллионам лишних запросов ежедневно, в итоге свыше 45 миллионов сетевых вызовов каждый день только на один компонент. Решение было найдено в применении WebSockets и GraphQL подписок. В отличие от традиционных HTTP-запросов, которые требуют нового соединения для каждого запроса-ответа, WebSockets открывают постоянное двунаправленное соединение между клиентом и сервером. Такая архитектура позволяет серверу мгновенно отправлять обновления клиенту сразу после изменения данных, избавляя от необходимости периодически проверять актуальность информации.
Для интеграции с WebSockets GitLab задействовал механизм GraphQL подписок. GraphQL расширяет возможности простого запроса и мутации, предоставляя клиенту возможность подписаться на изменения конкретных данных. Благодаря этому наиболее динамичные элементы интерфейса, такие как статус задания CI, теперь автоматически обновляются в реальном времени без каких-либо задержек. В техническом плане команда GitLab рефакторила компонент отображения заголовка статуса сборки, заменив устаревший polling на современную подписку. В реализации использовался ActionCable - встроенный в Ruby on Rails фреймворк для работы с WebSockets, что позволило интегрировать технологию в существующую архитектуру без крупных переписок.
Результаты данных изменений впечатляют. Количество сетевых вызовов для обновления информации в компоненте заголовка снижается более чем на 92%, упав с 45 миллионов до примерно 3,4 миллионов запросов в сутки. Благодаря этому пользователи теперь видят обновления статуса CI процесса мгновенно, без задержек до 30 секунд, которые раньше были нормой. Кроме снижения нагрузки, это заметно повышает комфорт работы в системе и способствует быстрому выявлению проблем на ранних этапах сборки и тестирования. С точки зрения серверных ресурсов, переход на WebSockets также позитивно сказался на производительности.
При длительном мониторинге CPU загрузки и операций за команду никаких значительных пиков или перегрузок не было зафиксировано. Таким образом, GitLab удалось добиться компромисса между масштабируемостью и высокой отзывчивостью системы, что крайне важно для крупных организаций и команд, где CI/CD процессы работают непрерывно. Внедрение WebSockets вместе с GraphQL подписками становится одним из новых стандартов в сфере DevOps и систем непрерывной интеграции. GitLab служит ярким примером, как модернизация устаревших архитектурных решений позволяет кардинально улучшить пользовательский опыт, снизить избыточность сетевого трафика и экономить ресурсы инфраструктуры. Причем это лишь первый шаг на пути к повсеместному отказу от polling во всех компонентах платформы.
Компания намерена продолжать трансформацию, чтобы обеспечить реальное время для каждой оповещения о статусах сборок, тестов и других ключевых процессов в GitLab. В будущем пользователи смогут наблюдать мгновенную реакцию интерфейса в любом месте системы, что станет мощным инструментом повышения продуктивности и эффективности. Если вы еще не пользовались GitLab Ultimate или GitLab Duo Enterprise, сейчас прекрасная возможность ознакомиться с нововведениями. Кроме того, платформа предлагает бесплатный пробный период на 30 дней, что позволяет оценить удобство и скорость обновления статусов в реальной работе. Итоги внедрения WebSocket-технологий в GitLab CI демонстрируют важность современных методов связи между клиентом и сервером для создания действительно responsive и удобных в использовании приложений.
Сокращение API вызовов с 45 миллионов до 3,4 миллионов в сутки говорит о снижении нагрузки на серверы и улучшении экологичности цифровой инфраструктуры. Переход на технологии реального времени - это не просто технический апгрейд, а шаг в сторону качественно нового уровня взаимодействия с пользователями. Как и многие инновации в сфере DevOps, это усилие направлено на ускорение доставки программного продукта, сокращение времени простоя, раннее обнаружение и устранение сбоев в работе. Таким образом, GitLab демонстрирует, что внедрение современного веб-стандарта WebSockets и возможностей GraphQL подписок дает значительное преимущество и является залогом успешного и масштабируемого развития платформы. В мире постоянно растущих нагрузок и потребности в мгновенном доступе к данным именно такие решения помогут компаниям эффективно управлять процессами разработки и поддержания качества программного обеспечения.
Следите за обновлениями GitLab, чтобы не пропустить дальнейшее расширение функционала, ориентированного на реальное время, и окунитесь в новые возможности современного DevOps уже сегодня. .