Мы готовились к релизу, но не к нагрузке: ошибки при запуске IT-проекта

Мы готовились к релизу, но не к нагрузке: ошибки при запуске IT-проекта

Перед запуском нашего сервиса всё выглядело спокойно. Продукт прошёл внутреннее тестирование, основные ошибки исправили, сервер работал с запасом. Мы несколько раз прогнали ключевые сценарии и решили, что технически готовы к релизу.

Первые часы показали обратное.

Пользователи начали заходить одновременно, создавать учётные записи, загружать файлы и запускать операции, которые во время тестов выполнялись по отдельности. Сервис ещё работал, но ответы становились медленнее. Затем начали появляться ошибки, а фоновые задачи выстроились в длинную очередь.

Проблема была не в одном критическом баге. Мы просто допустили несколько типичных ошибок, каждая из которых по отдельности казалась незначительной.

Ошибка №1. Мы тестировали функции, а не поведение системы

До релиза мы хорошо проверили, может ли пользователь зарегистрироваться, войти в аккаунт и выполнить нужное действие. Но почти не проверяли, что произойдёт, если всё это одновременно сделают сотни людей.

Обычные тесты отвечают на вопрос: «Работает ли функция?» Нагрузочные — на другой: «Продолжит ли она работать, когда пользователей станет больше?»

У нас регистрация проходила нормально, пока запросы поступали по одному. При росте нагрузки база данных стала отвечать медленнее, а отправка писем дополнительно занимала ресурсы. В результате простой сценарий начал тормозить всю систему.

После релиза пришлось срочно искать узкое место, хотя это можно было сделать заранее на тестовой среде.

Ошибка №2. Весь проект находился на одном сервере

Приложение, база данных, пользовательские файлы и фоновые задачи работали на одной машине. На старте это было удобно: меньше настроек, ниже расходы, проще развертывание.

Но при резком росте нагрузки компоненты начали мешать друг другу. Обработка файлов забирала процессорное время, база занимала память, а фоновые задачи конкурировали с запросами пользователей.

Увеличить характеристики сервера можно было, но это лишь временно отодвинуло бы проблему. Поэтому мы начали смотреть в сторону облачного провайдера, где ресурсы можно разделять и наращивать по мере необходимости, не перенося каждый раз весь проект на новую машину.

Сначала вынесли фоновые задачи, затем отделили базу данных и хранение файлов. Архитектура не стала сложной за один день, но отдельные процессы перестали бороться за ресурсы одного сервера.

Ошибка №3. У нас не было полезного мониторинга

Формально наблюдение за сервером было настроено. Мы видели загрузку процессора, объём свободной памяти и место на диске.

Но этих данных оказалось мало.

Мы не знали, какие запросы выполняются дольше всего, сколько времени занимает обращение к базе и на каком этапе пользователи получают ошибки. Когда сервис замедлился, команда видела сам факт проблемы, но не её источник.

После релиза мы добавили метрики времени ответа API, количества ошибок и длительности фоновых операций. Отдельно настроили уведомления о критических значениях.

Мониторинг должен не просто показывать, что «серверу плохо». Он должен помогать понять, какой компонент создаёт проблему и что изменилось перед сбоем.

Ошибка №4. Тяжёлые операции выполнялись сразу

Некоторые действия не требовали мгновенного результата, но приложение всё равно выполняло их внутри пользовательского запроса.

Например, после загрузки файла сервис сразу начинал его обработку. Пользователь ждал завершения, а сервер держал соединение и тратил ресурсы. Когда таких операций стало много, задержки быстро накопились.

Мы перенесли тяжёлые задачи в очередь. Теперь приложение принимает запрос, сообщает пользователю, что обработка началась, и выполняет работу отдельно.

Это не сделало операции быстрее сами по себе, но перестало заставлять человека ждать и снизило влияние тяжёлых задач на остальные функции сервиса.

Ошибка №5. Мы не подготовили план на случай перегрузки

До запуска обсуждались функции, дизайн и продвижение. Но никто не зафиксировал, что именно делать, если нагрузка окажется выше ожидаемой.

В результате первые решения принимались в спешке. Один разработчик искал проблему в базе, другой менял настройки сервера, третий пытался временно отключить часть функций. У команды не было единой картины происходящего.

Позже мы составили короткий аварийный план:

Такой документ не должен занимать десятки страниц. В критический момент полезнее одна понятная инструкция, чем сложный регламент, который никто не успеет прочитать.

Что помогло стабилизировать проект

Первым делом мы ограничили самые тяжёлые операции и временно отключили функции, без которых пользователи могли обойтись. Это снизило нагрузку и дало время на диагностику.

Затем оптимизировали несколько запросов к базе данных, вынесли фоновые процессы и увеличили ресурсы для наиболее загруженных компонентов. Одновременно настроили нормальный сбор ошибок и показателей производительности.

Главный вывод оказался простым: масштабирование начинается не с покупки более мощного сервера. Сначала нужно понять, что именно не справляется.

Иногда проблему решает индекс в базе данных. Иногда — очередь задач или ограничение размера загружаемых файлов. А иногда проект действительно перерос исходную инфраструктуру и её пора разделять.

Что мы сделали бы иначе

Перед следующим запуском мы обязательно проведём нагрузочное тестирование основных пользовательских сценариев. Не абстрактный тест количества запросов, а имитацию реального поведения: регистрацию, авторизацию, загрузку файлов и работу с базой данных.

Также заранее определим допустимые показатели. Фраза «сервис должен работать быстро» бесполезна. Нужны конкретные границы времени ответа, количества ошибок и загрузки ресурсов.

И главное — не станем проектировать инфраструктуру сразу для миллионов пользователей. Избыточно сложная система тоже создаёт проблемы. Но у проекта должна оставаться возможность расти без полного переезда в день, когда нагрузка уже стала критической.

Наш релиз нельзя назвать провальным: сервис удалось стабилизировать, данные не потерялись, а большинство пользователей почти не заметили внутренних проблем. Но несколько напряжённых часов показали, что функциональная готовность продукта ещё не означает готовность к реальной эксплуатации.

До релиза мы проверяли, работает ли наш сервис. После релиза пришлось срочно выяснять, выдерживает ли он собственный успех.


Следите за нашими статьями в Telegam, Дзен, VK и OK
Exit mobile version