Сезон 2026/27Проектирование веб-приложений
Уровень 7 из 21Ур. 7/21
до события2 дн 20 ч


Квест 5 (практическое задание) · уровень 6 · 10 октября

Прикидка нагрузки на салфетке

Формат
командный разбор
Время
80 мин
Оценка
0 / 0.5 / 1 — балл (множитель); полный квест даёт 0.94 XP (баллов)
Лекция
Риски и оценка нагрузки: критический путь и деградация

Зачем

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

Результат — анализ основного сценария, приблизительная оценка нагрузки, описание допустимой деградации и одно архитектурное решение в ADR. Расчёт должен помочь принять решение для вашего проекта, а не просто получить число запросов в секунду.

Стартовый набор

Работа командная, над собственным проектом. Нужны:

  • требования и уже описанные пользовательские сценарии;
  • диаграммы System Context и Container из квеста 4;
  • оценка аудитории, которую вы использовали на представлении проекта;
  • общий документ для записи анализа и калькулятор.

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

Что нужно сделать

1. Проследите основной сценарий по архитектуре

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

Действие пользователя → компонент → передаваемые данные → следующий компонент → результат.

Для каждого шага укажите:

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

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

2. Оцените ожидаемую нагрузку

Задайте один реалистичный режим использования приложения. Укажите:

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

Для оценки частоты выполнения сценария:

Выполнений в секунду ≈ активные пользователи × выполнений сценария одним пользователем за минуту / 60.

Для выбранного компонента:

Запросов в секунду ≈ выполнений сценария в секунду × обращений к компоненту на одно выполнение.

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

Для длительных операций дополнительно оцените одновременную обработку:

Одновременно выполняемых операций ≈ запусков в секунду × средняя длительность операции в секундах.

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

Пример: 60 активных пользователей запускают генерацию раз в 5 минут. Получается 12 запусков в минуту, или 0,2 в секунду. При длительности 30 секунд одновременно могут выполняться примерно 6 генераций.

Опишите ситуацию, создающую пик, и объясните выбранный масштаб. Если естественного пика нет, укажите это и отдельно задайте условную повышенную нагрузку для анализа перегрузки.

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

Запишите основания и допущения. Не выдавайте расчёт за результат измерений.

3. Выберите потенциальное узкое место

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

Опишите его:

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

Различайте:

  • Критическую зависимость: без компонента сценарий не завершится.
  • Узкое место: компонент или ресурс ограничивает скорость обработки.

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

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

4. Продумайте отказы и допустимую деградацию

Рассмотрите две разные ситуации:

  1. Один компонент критического пути временно недоступен.
  2. Компонент работает, но поток операций превышает его возможности.

Для каждой ситуации укажите:

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

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

Примеры:

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

Для простого приложения рассматривайте его собственные зависимости и ресурсы. Внешние сервисы не обязательны.

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

Отдельно обозначьте уже реализованное поведение и предлагаемые изменения.

5. Оформите одно решение в ADR

Выберите решение, вытекающее из анализа. Например:

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

Оформите краткий ADR — запись архитектурного решения:

  1. Заголовок и статус: предложено или принято.
  2. Контекст: проблема, требования, расчёт нагрузки, ограничения и допущения.
  3. Альтернативы: выбранный вариант и хотя бы одна содержательная альтернатива.
  4. Решение: что выбрано и почему.
  5. Последствия: преимущества, ограничения, риски, дополнительная сложность и поведение при проблемах.
  6. Условия пересмотра: какие изменения или результаты проверки потребуют вернуться к решению.

Сравнивайте альтернативы по одинаковым критериям. Формулировки «так принято», «это современно» и «это масштабируется» без связи с условиями проекта не являются обоснованием.

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

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

Чек-лист перед сдачей

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

Что сдаём

Один документ от команды с анализом и ADR. Укажите название проекта, участников, которые были на паре, и дату.

Шаблон документа лежит на Яндекс Диске.

Команда загружает свой файл в папку сдачи на Яндекс Диске. В названии файла укажите номер практики и название команды или проекта, например: Практика-5_Название-команды.md.

Диаграммы C4 можно приложить внутри документа или дать ссылки на них. Проверьте, что преподаватель сможет их открыть.

Зачтено, если

Оценка выставляется за общий результат команды.

Балл Когда ставится
1 Представлены все обязательные разделы. Расчёт нагрузки понятен и содержит допущения. Узкое место обосновано. Для отказа и перегрузки описаны допустимая деградация либо причины её невозможности, поведение пользователя и риски для данных. ADR связан с анализом, содержит альтернативу и последствия. Команда может объяснить выводы.
0.5 Представлен содержательный, но неполный результат: например, расчёт не раскрывает обращения к компонентам; одна из проблемных ситуаций разобрана поверхностно; неясно поведение незавершённых операций; в ADR недостаточно обоснованы альтернативы или последствия. Основной сценарий и логика анализа при этом понятны.
0 Работа не представлена либо не достигает требований на 0.5 балла: нет связного анализа сценария, нагрузки и проблемных ситуаций; выводы состоят из общих утверждений; команда не может объяснить принятые решения.

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

Типовые грабли

  • Всех пользователей посчитали одновременно активными. Разделяйте размер аудитории и число людей, которые выполняют сценарий в выбранный момент.
  • Смешали пользовательские действия, HTTP-запросы и обращения к базе данных. Подписывайте, для какого компонента считается нагрузка.
  • Получили RPS и объявили, что приложение его выдержит. Расчёт оценивает ожидаемый поток; способность системы справиться проверяется отдельно.
  • Критическую зависимость назвали узким местом без объяснения. Недоступность компонента и ограничение скорости обработки — разные проблемы.
  • Для отказа и перегрузки написали только «покажем ошибку». Укажите, что останется доступным, что произойдёт с данными и можно ли повторить операцию.
  • Добавили очередь, кэш или резервный сервис без необходимости. Каждая мера должна отвечать на конкретную проблему вашего проекта.
  • В ADR выбрали «современное решение», а альтернативу рассмотрели формально. Сравнивайте варианты по требованиям, нагрузке, рискам и сложности.
  • Предлагаемое поведение описали как уже реализованное. Явно разделяйте текущее состояние и изменения, которые ещё предстоит сделать.