← КурсСамостоятельный просмотрПульт

Пара 23 / декабрь

Нагрузка, задержки и ограниченные повторы

Провести небольшой контролируемый эксперимент и объяснить очередь и timeout.

Контекст

Меняем один фактор и измеряем результат.

Провести небольшой контролируемый эксперимент и объяснить очередь и timeout.

Эксперимент с нагрузкой

Меняем один фактор и измеряем результат.

01Фиксируем условия
02Меняем concurrency
03Измеряем
04Сравниваем / вывод

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

Среднее и медленный хвост

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

01Распределение
02p50
03p95
04Среднее

Аналогия: среднее время ожидания не гарантирует, что никто не стоял час.

Timeout, retry и идемпотентность

Ограничиваем ожидание и не усиливаем сбой повторами.

01Timeout
02Классификация ошибки
03Ограниченный retry
04Проверка идемпотентности

Аналогия: если кассир не ответил, повторная оплата может списать деньги второй раз.

Команды и наблюдения

Ubuntu / Bash, lab

DELAY_MS=200 docker compose up -d --force-recreate app
python3 scripts/load.py --requests 40 --concurrency 1
python3 scripts/load.py --requests 40 --concurrency 4
curl --max-time 0.1 -H "Content-Type: application/json" -d '{"hours":4}' http://127.0.0.1:8000/predict
DELAY_MS=0 docker compose up -d --force-recreate app

Разбор результата

Запрос curl с коротким timeout может оборваться до ответа; сервис мог уже начать обработку, поэтому повтор не объявляется безопасным автоматически.

Нагрузка имеет пределы; скрипт разрешает только loopback-адрес. Изменение delay передаётся через Compose environment, затем обязательно возвращается к 0.

На macOS

Метод эксперимента одинаков, но реальные числа нельзя напрямую сравнивать между ARM Mac и AMD64 WSL: CPU, виртуализация и эмуляция различаются. На каждой машине сравниваем серии при фиксированных условиях.

python3 scripts/load.py --requests 40 --concurrency 1
python3 scripts/load.py --requests 40 --concurrency 4

Один фактор, две серии

  1. Запишите версию, delay, число запросов и concurrency.
  2. Проведите две серии, сравните p50/p95 и суммарное время.
  3. Сделайте timeout короче delay, найдите событие запроса в логах.
  4. Объясните, когда retry допустим, а когда может создать дубликат; восстановите delay=0.

Что должно получиться

Таблица измерений и объяснение пределов выводов.

Нагрузка только на свой ноутбук; задержка убрана; timeout не принимают за доказательство необработанного запроса.

Ошибка для диагностики

Количество потоков повышают бесконечно, пытаясь «ускорить» сервис.

Симптом→Гипотеза→Проверка

Основные выводы

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

После пары

Описать timeout/retry-политику для чтения healthz и для POST с побочным действием.

Конспект, команды и разбор →

Среднее и p95: увидеть медленный хвост

20 синтетических запросов: 18 быстрых, 2 медленных.

Пара 24 / декабрь

Backup, восстановление и стабилизация

Сделать проверяемую копию учебного volume и восстановить данные в новый том.

Контекст

Решаем, сколько данных и времени можем потерять.

Сделать проверяемую копию учебного volume и восстановить данные в новый том.

RPO и RTO

Решаем, сколько данных и времени можем потерять.

01RPO: сколько данных
02RTO: сколько времени
03Способ копии
04Проверка восстановления

Аналогия: запасной ключ полезен, если он подходит к текущему замку.

Независимая копия

Volume защищает от пересоздания, backup — от потери состояния.

01Volume
02Согласованная копия
03Checksum
04Независимое хранение

Аналогия: копия документов в другом ящике того же сгоревшего шкафа не спасает.

Восстанавливаем отдельно

Не уничтожаем исходное состояние ради доказательства backup.

01Новый том
02Проверка архива
03Запуск отдельно
04Smoke + данные

Аналогия: аварийную копию сначала проверяют на запасном приборе.

Команды и наблюдения

Ubuntu / Bash, lab

bash scripts/backup.sh
# Use the exact backup path printed by the script
bash scripts/restore-check.sh backups/EXACT_DIRECTORY
# Review checksum, JSON validity, row count and health response

Разбор результата

Созданы events.jsonl и SHA256SUMS; отдельный восстановленный сервис отвечает и читает сохранённые строки.

EXACT_DIRECTORY — обозначение, замените реально выведенным именем. Не запускайте эту строку буквально. Скрипты работают только с текущим учебным compose.

На macOS

Скрипты комплекта выбирают sha256sum в Linux и shasum -a 256 в macOS автоматически. Все данные извлекаются через Docker, не через закрытые папки Desktop. Backup на том же Mac остаётся учебной копией.

bash scripts/backup.sh
# Replace EXACT_DIRECTORY with the printed backup path
bash scripts/restore-check.sh backups/EXACT_DIRECTORY

Проверить, а не просто скопировать

  1. Создайте минимум три события и сделайте cold backup.
  2. Запишите исходное число строк и checksum.
  3. Восстановите в отдельный временный volume, проверьте JSON и здоровье приложения.
  4. Запишите фактическое время; объясните, какие угрозы копия на том же ноутбуке не закрывает.

Что должно получиться

Архив, checksum и restore-report.md с измеренным результатом.

Основной том сохранён; восстановление действительно проверено; RPO/RTO не выдаются за достигнутые без измерения.

Ошибка для диагностики

Архив оказался пустым или относится к другому Compose project.

Симптом→Гипотеза→Проверка

Основные выводы

  1. Нет, нужно проверить чтение, содержание и реальное восстановление.
  2. Отказ диска или потеря ноутбука затронут обе копии.

После пары

Дополнить runbook восстановлением и планом независимого хранения для настоящего проекта.

Конспект, команды и разбор →