Тормозит в часы пик, а ночью всё хорошо
Отчёт, выгрузка или массовый импорт одного клиента занимает базу, и остальные ждут. Жалобы приходят в одно и то же время, а причину ищут по догадкам.
Масштабирование SaaS-продукта начинается не с микросервисов и не с новых серверов, а с замера: что именно замедляется, при каком росте и у кого из клиентов. Мы берём живую платформу, находим три-четыре места, которые дают почти всю нагрузку, и чиним их от дешёвого к дорогому: запросы, кэш, фоновые задачи, разделение клиентов.
Обследование — 200 000 ₽, 2–3 неделиСначала замеры на ваших данных, потом правкиИсходный код в вашем репозитории с первого коммита
Отчёт, выгрузка или массовый импорт одного клиента занимает базу, и остальные ждут. Жалобы приходят в одно и то же время, а причину ищут по догадкам.
Один просит вход через корпоративный каталог, другой отдельную базу, третий выгрузку журнала. Продукт обрастает ветками условий, и релиз пугает команду.
Изменение структуры базы делают ночью и с остановкой сервиса, потому что таблица стала большой, а как менять её на ходу, никто не проверял.
Мощности подняли дважды, а время ответа почти не изменилось: предел был в блокировке, в числе соединений с базой или в одном запросе, а не в процессоре.
Рост бывает разным, и у каждого вида своё первое узкое место. Поэтому «масштабировать» без уточнения «что именно растёт» нельзя.
Первую неделю мы не меняем ничего. Нужны данные о том, где платформа тратит время сейчас, иначе любая правка может сделать хуже или просто ничего не изменить.
Берём журналы приложения, балансировщика и медленных запросов базы и составляем список операций по частоте и суммарному времени. Обычно три-четыре операции дают почти всю нагрузку: список с фильтрами, главная страница кабинета, экспорт, пересчёт.
Сценарий для испытаний строится по этому профилю, на копии боевых данных с обезличенными клиентами. Нагрузку поднимаем ступенями до отказа и записываем, что отказало первым: процессор, память, соединения с базой, блокировка или внешняя система. На ровной синтетической нагрузке то, что ломается в пик, не видно.
Меры упорядочиваются от дешёвых и обратимых к дорогим и необратимым. Перестройка хранения данных стоит дороже, чем индекс, поэтому к ней приходим только тогда, когда индекс, кэш и фон не помогли. После каждой правки замер повторяется на тех же данных: если время не изменилось, правка считается неудавшейся и откатывается.
Итог оформляется документом: профиль, узкие места по порядку важности, меры с оценкой работы. С ним можно идти к другому подрядчику или делать самим.
Чем ниже строка, тем больше стоит мера и тем сложнее её отменить. Пропускать ступени вниз без замера мы не предлагаем.
В B2B-продукте нагрузка распределена неравномерно: небольшая часть клиентов создаёт большую часть запросов. Это не ошибка, это свойство продукта, и к нему готовятся заранее.
«Шумный сосед» — клиент, чья операция занимает общие ресурсы. Типичный случай: ночью запущен импорт на большой объём данных, и утром у всех остальных медленно открываются списки. Чинят это не мощностью, а правилами.
Если очередь одна на всех, большой клиент ставит в неё сотню задач, и маленькие ждут за ними. Задачи берутся по очереди от разных клиентов, а не подряд, и у тяжёлых операций отдельные исполнители, чтобы не мешать быстрым.
На платформе с платящими клиентами «остановим на ночь» перестаёт быть нормальным ответом. Менять структуру данных приходится на ходу, и для этого есть последовательность.
Изменение делится на три релиза. Сначала добавляется новая структура рядом со старой, и приложение умеет работать с обеими. Затем данные переносятся порциями в фоне, с проверкой количества и сумм. Только после этого старая структура убирается. Каждый шаг можно откатить, пока не выполнен следующий.
Нужны реестр клиентов с указанием, где живёт каждый, процедура копирования данных одного клиента с проверкой полноты, короткое окно переключения и план возврата. Если приложение уже подставляет идентификатор клиента на одном уровне кода и не обращается к чужим данным напрямую, перенос обходится дешевле. Тесты изоляции прогоняются до и после переноса. Схемы изоляции описаны в статье про мультиарендность.
Цены — по тарифам. Точная цена только у обследования, дальше вилка, которая сужается по его результатам. Остановиться можно после любой ступени.
Профиль операций, нагрузочная модель, узкие места по порядку важности, меры с оценкой работы. Вычитается из первого этапа, если продолжаете с нами.
Если продукт обменивается с несколькими внешними системами и работает в нескольких окружениях: схема обменов, зависимости от чужих систем, поведение при их недоступности.
Индексы, переписанные запросы, кэш, перенос одной тяжёлой операции в фон. Замер до и после на ваших данных, протокол испытаний.
Секционирование, реплика для чтения, отдельное хранилище для отчётов, лимиты и очереди по клиентам, подготовка переноса клиентов в отдельные базы.
Перенос клиентов, нагрузочные испытания на новой схеме, регламент миграций без остановки, мониторинг, передача исходников и инструкции.
Мониторинг, разбор инцидентов, плановые доработки с пакета на 60 000 ₽. Сверх пакета — 5 000 ₽ в час.
Получаем доступ к журналам, метрикам и копии базы (обезличенной, если в ней персональные данные), договариваемся, кто отвечает за вашу инфраструктуру. Ничего не меняем.
Профиль запросов, нагрузочный сценарий на копии, первый отказ под нагрузкой. На выходе перечень узких мест, меры с оценкой и порядок; здесь решаем, нужен ли пилот.
Каждая мера идёт отдельным небольшим изменением в вашем репозитории и сопровождается замером до и после. Не помогло — откатываем.
Нагрузочное испытание на исправленной версии, проверка восстановления из копии, выход на боевую платформу в тихие часы с планом возврата.
Следующие меры по ступеням, либо передаём инструкцию и мониторинг вашей команде, либо сопровождаем сами.
Если метрик и журнала медленных запросов нет, первые недели уходят на их настройку. Цена обследования от этого не меняется, а срок и первая часть работ растут.
Каждое отдельное окружение и каждый клиент на своей базе добавляют миграции, копии и проверки.
Если узкое место внутри обмена с внешней системой, чинить приходится и процесс обмена, и согласование изменений с её владельцем.
Эта страница про рост уже работающего продукта: замеры, узкие места, миграции, нагрузка от крупных клиентов. Если платформы ещё нет, начинают с разработки SaaS-платформы, а для первой версии — с состава и ограничений, как в статье «Как разработать SaaS с нуля».
Если замеры показали, что границы между частями системы проведены неверно и нужно разделять сервисы, речь о микросервисной архитектуре и высоконагруженных системах. Если код трудно читать и менять и непонятно, с чего начинать, сначала нужен аудит кода и архитектуры.
Порядок узких мест подробно разобран в статье «Как масштабировать SaaS и B2B-продукт».
Что растёт, что ломается первым и в каком порядке это чинить. Пригодится до того, как вы закажете дорогую перестройку.
Три схемы изоляции и что они значат для переноса клиентов, копий и миграций.
Когда выделять сервисы, а когда достаточно навести порядок внутри приложения. Помогает не перестраивать больше, чем нужно.
Сорок минут созвона: что за продукт, как вырос, на чём стоит и что тормозит. По итогам скажем, хватит ли правок вашей командой или нужна ступень обследования, и в какую вилку это укладывается.
С замера. Берём журналы, медленные запросы и профиль операций, строим нагрузочную модель на копии данных и находим, что отказывает первым. Только потом выбираем меру: чаще всего это индексы, кэш или перенос тяжёлой операции в фон, а перестройка архитектуры нужна заметно реже.
Обследование стоит 200 000 ₽ за один-два процесса и 350 000 ₽ при нескольких системах; оно вычитается из первого этапа, если продолжаете с нами. Исправление первого узкого места укладывается в лёгкий пилот (150 000–400 000 ₽, 2–8 недель), перестройка слоя данных — в тяжёлый (400 000–1 200 000 ₽, 2–3 месяца). Вывод в эксплуатацию начинается от 1 500 000 ₽ и режется на этапы по 300 000–700 000 ₽.
Чаще нет. Многие продукты выдерживают рост на настроенном монолите: индексы, кэш, фоновые задачи, несколько экземпляров приложения, реплика для чтения. Сервисы выделяют, когда часть системы живёт по другим правилам нагрузки или надёжности. Решение принимается по замерам и записывается с причинами.
Да, если приложение к этому готово: есть реестр клиентов, идентификатор клиента подставляется на одном уровне кода, миграции прогоняются по каждой базе. Процедура включает копирование с проверкой полноты, короткое окно переключения и план возврата. Если приложение к этому не готово, сначала приводим в порядок слой доступа к данным.
Мы стараемся этого не допускать. Изменения структуры данных идут в три релиза (расширить, перенести, сжать), выход на боевую платформу назначается на тихие часы с планом возврата. Если операция без остановки невозможна, согласуем окно заранее.
Замером до и после на одних и тех же данных и по одному сценарию. Если время ответа не изменилось, правку считаем неудавшейся и откатываем. Нагрузочные сценарии остаются у вас. Конкретный рост производительности заранее не обещаем: он зависит от причины и от данных.
На вашем оборудовании или у вашего хостера. Исходный код и все изменения лежат в вашем репозитории с первого коммита, результат работ передаётся по акту, порядок передачи прав записывается в договоре, открытые компоненты остаются под своими лицензиями.
Мы в Ростове-на-Дону, работаем с заказчиками по всей России: удалённо и в вашем контуре. Доступ к системам и обследование согласуем на старте с вашей службой безопасности.