nodbox
Разделы документации

Автомасштабирование

Как платформа добавляет экземпляры под нагрузку и что в этом можно настроить.

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

Экземпляр - одна запущенная копия приложения. Все экземпляры одного приложения получают одинаковый размер, код и переменные, а запросы распределяются между ними.

Масштабом управляют два числа

Поле API Название в панели Что задаёт Пределы По умолчанию
max_instances Максимум экземпляров сколько экземпляров приложение может держать одновременно от 1 до 10 1
concurrency Запросов на экземпляр порог одновременных запросов на экземпляр, после которого нужен ещё один от 1 до 1 000 100

Числа читаются в паре. Максимум говорит, докуда приложение вырастет, порог - с какого места оно начнёт расти. При максимуме 1 порог ничего не меняет: расти некуда.

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

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

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

Минимум задаёт сон

Отдельного поля для минимума нет. Минимум определяет сон, то есть поле sleep_enabled:

Сон Минимум Что это значит
включён 0 без запросов приложение уходит в ноль экземпляров и просыпается от первого запроса
выключен 1 один экземпляр работает круглосуточно

Сон включён по умолчанию. Через сколько тишины приложение засыпает, от 60 секунд до часа, и сколько занимает пробуждение, разбирает страница Сон и пробуждение.

Итоговый диапазон складывается из двух настроек: при включённом сне приложение держит от 0 до max_instances экземпляров, при выключенном - от 1 до max_instances.

Настройки действуют со следующей версии

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

Чтобы новый максимум заработал, закажи версию или запушь в ветку с автодеплоем. В панели для этого есть галка «Задеплоить после сохранения»: с ней кнопка «Сохранить» заодно заказывает версию. Подробнее о том, что хранит версия, - в разделе Версии и откат.

Как задать масштаб

В панели масштаб лежит на странице приложения, в настройках, в карточке «Сон и масштаб». Там четыре поля: переключатель «Засыпать без запросов», срок сна «Когда засыпать», «Запросов на экземпляр» и «Максимум экземпляров». У воркера остаётся только максимум. Под формой панель показывает, сколько места в лимитах проекта займёт выбранное сочетание размера и максимума, и предупреждает до нажатия «Сохранить», если места не хватает.

Через API поля задаются при создании приложения в POST /api/v1/applications и меняются в PATCH /api/v1/applications/{id}. Правится ровно то, что прислано. Для PATCH токену нужны права «деплоить» и «менять мощность». Все запросы и права описаны в разделе API nodbox.

{
  "sleep_enabled": true,
  "sleep_after_seconds": 900,
  "max_instances": 4,
  "concurrency": 50
}

Значение за пределами таблицы выше отвечает ошибкой 422.

В ответе GET /api/v1/applications/{id} те же max_instances и concurrency показывают настройки приложения. Рядом лежат два поля о том, что происходит сейчас:

Поле Что отдаёт
instances сколько экземпляров держит работающая версия сейчас; 0 у спящего приложения, пусто, пока платформа ещё не прочитала состояние
cold_start сколько занял последний запуск экземпляра: ms и at

Число экземпляров платформа читает раз в минуту, а пока в панели открыта карточка приложения - чаще. Время запуска измеряется с точностью до секунды, поэтому панель показывает его с оговоркой «около».

Экземпляры проекта считаются вместе

Все приложения проекта делят общий запас места. Лимиты проекта по умолчанию такие:

  • экземпляров до 12 на все приложения вместе
  • процессора до 6 ядер
  • памяти до 6 ГБ

Все цифры собраны в разделе Лимиты и квоты.

Место считается по потолку, а не по тому, сколько экземпляров работает сейчас. Приложение размера Eco 512 МБ с процессором 0,5 ядра и максимумом 4 занимает в проекте 2 ядра и 2 ГБ памяти, даже когда спит или работает в одном экземпляре. Размер каждого экземпляра берётся из размера приложения, поэтому проект с крупными размерами упирается в процессор и память раньше, чем в число экземпляров.

Из этого следует три правила:

  • Увеличение максимума проверяет квоту. Если процессора или памяти не хватает, ответ - 403 с полями quota, limit, usage и requested. Приложение остаётся с прежним максимумом.
  • Снижение максимума место не освобождает до деплоя. Работающая версия сохраняет прежний потолок, пока её не заменит новая.
  • Двенадцать экземпляров - общий потолок проекта. Платформа держит место не больше чем под двенадцать экземпляров. Сумма максимумов всех приложений, в том числе спящих и остановленных, может выйти за эту границу: запрос не отклоняется, но лишние экземпляры не поднимутся. Следи, чтобы сумма максимумов не превышала 12.

Что видно в панели

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

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

Что не масштабируется

  • Размер. Масштабирование добавляет экземпляры, но не делает их крупнее. Процессор и память одного экземпляра задаёт размер: Размеры приложения.
  • Состояние экземпляра. Каждый экземпляр - отдельная копия приложения со своей памятью и своей файловой системой. Данные в памяти и файлы, записанные на месте, другим экземплярам не видны, а два запроса одного пользователя могут попасть на разные экземпляры. Сессии, кэш и загруженные файлы держи в базе или во внешнем хранилище.
  • База данных. База не растёт вместе с приложением: у неё свой размер и свой лимит соединений, а каждый экземпляр открывает соединения сам. Размеры баз описаны в разделе Размеры и цена баз.
  • Воркер. У воркера нет адреса и запросов, поэтому у него нет ни порога, ни сна. Подробнее о том, чем воркер отличается от веб-приложения, - в разделе Веб-приложения и воркеры.

Размер называет цену одного экземпляра

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

Что дальше


Страница в markdown, так её читает агент: /docs/apps/scaling.md