Архитектура высоконагруженных систем
Как проектировать системы под нагрузку: требования к качеству (ISO 25010, ГОСТ), архитектурные решения и их проверка замером на сквозном проекте Boardy.
Преподаватель: Шадрин Д. Б.
Группы: АТ-01
Пары: среда: 14:20 лекция, 16:20 практика (Teams)
Задания и сроки
| Задание | Срок | |
|---|---|---|
| ДЗ 5. Скилл выявления НФТ и журналы Boardy, закрывающие НФТ | 11.11.2026 14:00 | идёт |
| ДЗ 4. Журналы всех сервисов Boardy — в папке ./logs | 04.11.2026 14:00 | идёт |
| ДЗ 3. Работоспособность Boardy: вход через GitHub и уведомления | 04.11.2026 14:00 | идёт |
| ДЗ 2. Исправление архитектуры Boardy | 21.10.2026 14:00 | срок прошёл |
| ДЗ 1. Исправление Boardy | 21.10.2026 14:00 | срок прошёл |
| ДЗ 0. Техническое задание на Boardy | 21.10.2026 14:00 | срок прошёл |
Тексты заданий
ДЗ 5. Скилл выявления НФТ и журналы Boardy, закрывающие НФТ
срок 11.11.2026 14:00
ДЗ 5. Скилл выявления НФТ и журналы Boardy, закрывающие НФТ
Срок: 11.11.2026, 14:00 (Екатеринбург) · Сдача: Pull request lab5 → main, в описании Closes #<номер задачи>
Цель
Две части:
- Скилл. Превратить методику лекции 5 в скилл для нейросети, прогнать его по ТЗ Boardy и получить итоговый перечень НФТ с проверками.
- Практика 5. Довести до работы у себя шесть шагов практики 5: журналы Boardy закрывают НФТ, и каждое требование закрыто, когда его проверка прошла.
Перед началом
git checkout main && git pull→git checkout -b lab5.- Методичка «Выявление НФТ» — в
lab/lab5/. - ДЗ 4 должно работать: журналы всех сервисов пишутся в
./logs/<сервис>.
Часть 1. Скилл
- Скилл. Опишите процедуру методички как скилл для любой нейросети на ваш выбор: один файл или несколько
.md— шаги, справочники, формулы, формат вывода. Если работали в браузере, файлы скилла всё равно положите в репозиторий. Проверка: файлы вlab/lab5/skill/. - Прогон по Boardy. На вход — ТЗ Boardy, на выходе — НФТ ко всей системе и к функциям, по формуле требования, с нумерацией по ТЗ и проверкой у каждого. Проверка:
lab/lab5/nft.md. - Доработка. Сверьте результат с методичкой: что скилл пропустил, что придумал лишнего. Исправьте скилл и прогоните ещё раз. Проверка: каждая доработка — отдельный коммит с описанием «что было не так → что поправил».
Часть 2. Практика 5: журналы закрывают НФТ Boardy
| Шаг | Что сделать | Закрывает | Проверка |
|---|---|---|---|
| 1. Сквозная метка запроса | nginx создаёт request_id и передаёт дальше; Laravel и FastAPI пишут его в каждую строку журнала, Laravel — в JSON | 4.6.1.2 | один request_id находится в журналах nginx, Laravel и API |
| 2. Одно место поиска | Alloy собирает журналы из ./logs → Loki → Grafana | 4.6.1.2 | в Grafana по request_id видны строки всех трёх сервисов |
| 3. Журнал действий | отдельный канал audit в Laravel: вход, выход, доски, карточки, комментарии — кто (id), что, над чем, когда, результат; хранение 183 дня | 4.6.4.8.3 | после каждого действия в интерфейсе — строка в audit |
| 4. Персональные данные | в журналы идёт id пользователя, а не e-mail; нет паролей и токенов | 4.6.4.8.1 | поиск e-mail и секретов по ./logs → 0 совпадений |
| 5. Потолок по диску | ротация по размеру и сроку для всех журналов; расчёт объёма | 4.6.4.2.3, 4.6.4.3.1 | пробный запуск ротации; расчёт «сколько займут журналы за срок хранения» |
| 6. Оповещение о сбое | правило в Grafana: доля ответов 5xx за 5 минут; учение — уронить API и дождаться оповещения | 4.6.1.1 | время от сбоя до оповещения ≤ 5 минут |
Если Loki или Grafana (шаги 2 и 6) с первого раза не завелись — опишите в отчёте, на чём остановились. Разберём на следующей паре.
Отчёт lab/lab5/report.md — таблица «пункт ТЗ → шаг → проверка → замер (что получилось на самом деле) → закрыто / нет».
Что сдать
| Что | Где в репозитории |
|---|---|
| Скилл и его доработки | lab/lab5/skill/, история коммитов |
| Итоговые НФТ Boardy | lab/lab5/nft.md |
| Журналы: метка, действия, ротация, сбор, оповещение | код сервисов, конфиги, docker-compose.yml |
| Отчёт с замерами | lab/lab5/report.md |
Критерии приёмки
| # | Критерий | Баллы |
|---|---|---|
| 1 | Скилл в репозитории, по нему можно повторить прогон | 15 |
| 2 | Итоговые НФТ Boardy: по формуле, с нумерацией по ТЗ, с проверкой у каждого | 20 |
| 3 | Доработки скилла видны в истории коммитов | 5 |
| 4 | Шаг 1: сквозная метка | 15 |
| 5 | Шаги 3–4: журнал действий без персональных данных | 20 |
| 6 | Шаг 5: ротация и расчёт | 10 |
| 7 | Шаги 2 и 6: Loki, Grafana, оповещение | 5 |
| 8 | Отчёт с замерами по каждому пункту ТЗ | 10 |
| Итого | 100 |
Не принимается: скилл без прогона или прогон без скилла; журналы в репозитории (logs/ не в .gitignore); пароли или токены в журналах; система не поднимается с чистого клона.
Как сдать
git add . && git commit -m "…"→git push -u origin lab5- На GitHub: Pull request
lab5→main, в описанииCloses #<номер задачи>. - Сдано в срок, если запрос открыт до срока — время фиксирует GitHub.
ДЗ 4. Журналы всех сервисов Boardy — в папке ./logs
срок 04.11.2026 14:00
Срок: 04.11.2026, 14:00 (Екатеринбург) · Сдача: Pull request lab4 → main, в описании Closes #<номер задачи>
Цель
Довести до конца решение с практики 21.10: каждый сервис Boardy сам пишет свои журналы в папку проекта ./logs/<сервис>, у каждой папки правильный владелец. Это закрывает строку чек-листа НФТ «журнал есть у каждого сервиса и известно, где он» (сопровождаемость · анализируемость).
Перед началом
- Boardy поднимается:
docker compose up -d→ http://localhost:8080. git checkout main && git pull→git checkout -b lab4. Если на практике вы уже начали в другой ветке — продолжайте в ней и назовите PRlab4.- Пошаговые фрагменты конфигов — в методичке
lab/lab4/guide.md.
Как выполнять
- Карта «было». Для каждого сервиса — nginx, php-fpm, Laravel, FastAPI (uvicorn), MySQL, Redis — запишите, какие журналы он пишет и куда. Проверка: таблица в
lab/lab4/report.md. - Папки и права. Создайте
./logs/<сервис>для всех шести сервисов и отдайте каждую тому пользователю, под которым сервис пишет журнал. Проверка: послеdocker compose up -dс чистой папкиlogs/все сервисы пишут журналы без ошибок прав;logs/в.gitignore. - nginx, Laravel, uvicorn — то, что начали на практике, доведите до рабочего состояния у себя. Проверка: после открытия ленты и запроса к API строки появились в
logs/nginx/access.log,logs/laravel/…,logs/api/…. - php-fpm. Журнал ошибок и журнал доступа — в
logs/php-fpm/. Проверка:php-fpm -ttпоказывает ваши пути; после открытия ленты вlogs/php-fpm/есть журналы. - MySQL. Журнал ошибок — в
logs/mysql/. Проверка: после перезапуска MySQL в журнале строки запуска. - Redis. Журнал — в
logs/redis/. Проверка: после перезапуска Redis в журнале строки запуска. - Карта «стало». Проверка: в отчёте таблица «сервис → журнал → путь в контейнере → файл на хосте → владелец».
Что сдать
| Что | Где в репозитории |
|---|---|
| Журналы всех сервисов, права | docker-compose.yml, конфиги сервисов (infra/… или в каталогах сервисов) |
| Карты «было / стало», проверки | lab/lab4/report.md |
Критерии приёмки
| # | Критерий | Баллы |
|---|---|---|
| 1 | Журналы всех шести сервисов пишутся в ./logs/<сервис> и появляются после запуска с чистой папки | 50 |
| 2 | Права: каждая папка у своего владельца, без chmod 777 | 20 |
| 3 | Отчёт: карты «было / стало», проверки | 30 |
| Итого | 100 |
Не принимается: журналы в репозитории (папка logs/ не в .gitignore); chmod 777 на папки журналов; система не поднимается с чистого клона; работа сделана нейросетью.
Как сдать
git add . && git commit -m "…"→git push -u origin lab4- На GitHub: Pull request
lab4→main, в описанииCloses #<номер задачи>. - Сдано в срок, если запрос открыт до срока — время фиксирует GitHub.
ДЗ 3. Работоспособность Boardy: вход через GitHub и уведомления
срок 04.11.2026 14:00
Срок: 04.11.2026, 14:00 (Екатеринбург) · Сдача: Pull request lab3 → main, в описании Closes #<номер задачи>
Цель
Довести до рабочего состояния две функции из ТЗ Boardy, которые сейчас не работают: вход через GitHub и уведомления о новых объявлениях в реальном времени. Результат — обе функции работают с чистого клона, и это показано.
Перед началом
- ДЗ 2 слито в
main. git checkout main && git pull→git checkout -b lab3
Как выполнять
- Вход через GitHub. Заведите своё OAuth-приложение на GitHub и подключите его к Boardy. Ключи — только в
.env, в репозиторий не коммитить; в.env.example— пустые строки с пояснением. Проверка: кнопка «Войти через GitHub» → GitHub → вы вошли в Boardy под своим аккаунтом. - Уведомления в реальном времени. Сценарий: в одном браузере открыта лента, во втором другой пользователь подаёт объявление. В первом браузере без перезагрузки страницы появляется уведомление о новом объявлении — не позже чем через 5 секунд. Проверка: сценарий воспроизводится, видео или два скрина приложены.
- Найдите, почему не работало. Пройдите путь события от подачи объявления до экрана получателя и запишите каждое место, где оно терялось, и причину. Проверка: в отчёте список «где терялось → почему».
- Чините по одному. Одна причина — один коммит, в сообщении — что было не так. Проверка: после каждой правки система поднимается, остальные функции работают как раньше.
- Не перегибайте. Делаем минимально необходимое: брокеры сообщений (RabbitMQ, Kafka), новые сервисы и переписывание существующих в этой работе не нужны. Проверка: для каждой правки вы можете сказать, без чего сценарий не работал.
- Проверьте с чистого клона:
git cloneв новую папку →.envс ключами →docker compose up -d→ оба сценария. Проверка: оба работают.
Что сдать
| Что | Где в репозитории |
|---|---|
| Исправления | в коде, по коммиту на причину |
| Список «где терялось → почему → коммит» | lab/lab3/report.md |
| Видео или скрины обоих сценариев | lab/lab3/ |
Критерии приёмки
| # | Критерий | Баллы |
|---|---|---|
| 1 | Вход через GitHub работает, ключей в репозитории нет | 25 |
| 2 | Уведомление приходит во второй браузер без перезагрузки, не позже 5 секунд | 35 |
| 3 | Причины найдены и записаны | 20 |
| 4 | По коммиту на причину, система поднимается с чистого клона | 20 |
| Итого | 100 |
Не принимается: ключи GitHub в репозитории; уведомление только после перезагрузки страницы; все правки одним коммитом; работа сделана нейросетью.
Как сдать
git add . && git commit -m "…"по каждой правке →git push -u origin lab3- На GitHub: Pull request
lab3→main, в описанииCloses #<номер задачи>. - Сдано в срок, если запрос открыт до срока — время фиксирует GitHub.
ДЗ 2. Исправление архитектуры Boardy
срок 21.10.2026 14:00
Срок: 21.10.2026, 14:00 (Екатеринбург) · Сдача: Pull request lab2 → main, в описании Closes #<номер задачи>
Цель
Поправить реализацию Boardy по базовым принципам — эвристикам (DRY, KISS, YAGNI, SoC, закон Деметры, POLA) и SOLID, — чтобы следующие темы курса строились на ровной основе. Устройство кода меняем, поведение системы — нет.
Перед началом
- Список нарушений: ваши находки из общего документа «Анализ архитектуры системы» с практики 07.10 и презентация с разбором практики 2, которую выдал преподаватель.
- Система поднимается:
docker compose up -d→ http://localhost:8080. git checkout main && git pull→git checkout -b lab2
Как выполнять
- Зафиксируйте поведение «до». Пройдите по всем функциям системы (лента, объявление, комментарии, вход и регистрация, подача объявления, API) и сохраните результат: скрипт с запросами и их ответами или тесты. Проверка: результат «до» сохранён в
lab/lab2/report.mdили лежит в репозитории. - Составьте план правок. Из списка нарушений выберите, что исправляете, и у каждого пункта укажите принцип. Проверка: в отчёте таблица «нарушение → принцип → что сделаю».
- Исправляйте по одному. Одна правка — один коммит, в сообщении — что было не так и какой принцип нарушен. Проверка: после каждой правки система поднимается, функции работают как раньше.
- Не перегибайте. Делаем необходимое: DDD, фабрики «на будущее», новые слои и новая инфраструктура (логирование, метрики, очереди) в этой работе не нужны — сервис маленький. Проверка: для каждой новой абстракции вы можете назвать, какую правку она удешевляет.
- Проверьте поведение «после». Повторите прогон из шага 1. Проверка: результат совпадает с «до».
- Запишите итог. Проверка: в отчёте — что исправлено (ссылки на коммиты), что сознательно не стали делать и почему.
Что сдать
| Что | Где в репозитории |
|---|---|
| Исправления | в коде, по коммиту на правку |
| Таблица «нарушение → принцип → что сделано (коммит)» | lab/lab2/report.md |
| Проверка поведения до и после | lab/lab2/report.md (или скрипт/тесты в репозитории) |
| Что сознательно не стали делать и почему | lab/lab2/report.md |
Критерии приёмки
| # | Критерий | Баллы |
|---|---|---|
| 1 | Система поднимается с чистого клона, функции работают как до правок | 20 |
| 2 | Исправлены нарушения из списка | 40 |
| 3 | Каждое исправление — отдельный коммит с понятным сообщением | 15 |
| 4 | Отчёт: таблица с верно названным принципом, проверка до и после | 15 |
| 5 | Нет перегруза: новые абстракции обоснованы | 10 |
| Итого | 100 |
Не принимается: система не поднимается; все правки одним коммитом; поведение системы изменилось; работа сделана нейросетью.
Как сдать
git add . && git commit -m "…"по каждой правке →git push -u origin lab2- На GitHub: Pull request
lab2→main, в описанииCloses #<номер задачи>. - Сдано в срок, если запрос открыт до срока — время фиксирует GitHub.
ДЗ 1. Исправление Boardy
срок 21.10.2026 14:00
Срок: 21.10.2026, 14:00 (Екатеринбург) · Сдача: Pull request lab1 → main, в описании Closes #<номер задачи>
Цель
Привести систему в рабочее состояние: исправить косяки, которые вы нашли и которые ещё не нашли, и довести функциональные требования.
Перед началом
- ДЗ 0 сдано (запрос на слияние
lab0принят или открыт). git checkout main && git pull→git checkout -b lab1
Как выполнять
- Составьте список исправлений по общему документу с пары 30.09. Допишите косяки, которые найдёте по ходу.
- Исправляйте по одному: одно исправление — один коммит, в сообщении — что было не так и чем грозило. Проверка: после каждого исправления
docker compose up -dподнимается, функции работают. - Обязательно — технические дефекты, которые влияют на работу всей системы. Логирование, алерты и метрики на этом этапе не требуются.
- Доведите функциональные требования из ДЗ 0, если не успели.
- Запишите итог в отчёт: что исправлено (со ссылками на коммиты), что осталось и почему.
Что сдать
| Что | Где в репозитории |
|---|---|
| Исправления | в коде, по коммиту на исправление |
| Итог: исправлено / осталось | lab/lab1/report.md |
| Функциональные требования (финал) | lab/lab0/report.md |
Критерии приёмки
| # | Критерий | Баллы |
|---|---|---|
| 1 | Система поднимается с чистого клона и все функции работают | 20 |
| 2 | Исправлены технические дефекты, влияющие на всю систему | 40 |
| 3 | Каждое исправление — отдельный коммит с понятным сообщением | 15 |
| 4 | Отчёт: исправлено (ссылки на коммиты) / осталось и почему | 15 |
| 5 | Функциональные требования доведены | 10 |
| Итого | 100 |
Не принимается: система не поднимается; все правки одним коммитом; работа сделана нейросетью.
Как сдать
git push -u origin lab1- На GitHub: Pull request
lab1→main, в описанииCloses #<номер задачи>. - Сдано в срок, если запрос открыт до срока — время фиксирует GitHub.
ДЗ 0. Техническое задание на Boardy
срок 21.10.2026 14:00
Срок: 21.10.2026, 14:00 (Екатеринбург) · Сдача: Pull request lab0 → main, в описании Closes #<номер задачи>
Цель
Восстановить техническое задание на доставшуюся систему: что она делает и что должна делать. Это первая часть ТЗ — функциональные требования. Нефункциональные пока не пишем.
Перед началом
- Получите репозиторий: https://ai-info.ru/?c=wa2 → войдите через GitHub → выберите себя → примите приглашение.
- Установлены Git и Docker.
git clone <ваш репозиторий>→git checkout -b lab0
Как выполнять
- Запустите проект:
docker compose up -d. Проверка: http://localhost:8080 открывает ленту, http://localhost:8080/api/docs — документацию API. Если что-то мешает запуску — исправьте только это. - Пройдите систему руками и составьте список функций: лента, объявление, комментарии, регистрация, вход, подача объявления, пользователи, API. Проверка: каждую функцию вы сами выполнили.
- Опишите назначение системы: что она делает, для кого, какие роли пользователей.
- Напишите ТЗ — функциональные требования: пользовательские истории («Как роль, я хочу действие, чтобы цель») и к каждой пронумерованные ФТ (ФТ-1.1, ФТ-1.2…). У каждого ФТ — вход, что делает система, результат, реакция на ошибку. Проверка: каждая функция из шага 2 покрыта хотя бы одним ФТ.
Что сдать
| Что | Где в репозитории |
|---|---|
| Техническое задание: назначение, роли, истории, ФТ | lab/lab0/report.md |
Критерии приёмки
| # | Критерий | Баллы |
|---|---|---|
| 1 | Проект запускается из вашего репозитория | 10 |
| 2 | Назначение системы и роли пользователей | 15 |
| 3 | Пользовательские истории по всем функциям | 25 |
| 4 | Функциональные требования: пронумерованы, у каждого вход · действие · результат · ошибка | 40 |
| 5 | Без решений в требованиях: не «кнопка», «слайдер», «Redis», а что делает система | 10 |
| Итого | 100 |
Не принимается: нет lab/lab0/report.md; работа сделана нейросетью.
Как сдать
git add lab/lab0/report.md && git commit -m "ДЗ 0: ТЗ"→git push -u origin lab0- На GitHub: Pull request
lab0→main, в описанииCloses #<номер задачи>. - Сдано в срок, если запрос открыт до срока — время фиксирует GitHub.