Самоучитель: динамические веб-приложения
Глава 17 из 18VII. Инженерная устойчивость90 минут

Глава 17. Производительность и наблюдаемость без гадания

Оптимизация начинается с измеряемого пользовательского симптома и заканчивается повторным измерением на репрезентативных данных.

После главы вы сможете
  • разложить latency
  • найти N+1
  • выбрать безопасный кеш

Бюджет вместо слова медленно

Разложите время ответа на очередь, PHP, запросы к базе, внешние вызовы и передачу тела. P95 и P99 показывают хвост распределения лучше среднего. Сравнивайте одинаковый маршрут и объём данных до и после изменения.

Локальный быстрый запрос на пустой базе не доказывает production-план. Нужны реалистичная кардинальность и холодный сценарий кеша.

Сначала количество операций

N+1 возникает, когда список из N элементов запускает дополнительный запрос для каждого. Исправление может быть JOIN, пакетная загрузка по id или заранее спроектированная read model. Счётчик запросов в тесте помогает заметить регрессию до production.

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

Кеш — копия с политикой

Чтение через кешДля каждой копии определите источник истины, ключ, срок и способ инвалидировать устаревшее значение.RequestkeyCachehit/missSourceauthoritativeStorettl/versionResponsefreshness
Для каждой копии определите источник истины, ключ, срок и способ инвалидировать устаревшее значение.

Что кешировать

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

Cache stampede ограничивают lock, stale-while-revalidate или случайным разбросом TTL. Ошибка источника не должна бесконечно продлевать некорректные данные без наблюдаемого сигнала.

Фоновые задачи

Отправку письма, генерацию отчёта и тяжёлый импорт можно вынести из HTTP-ответа. Очередь меняет контракт: сообщение может прийти повторно, задержаться или не обработаться с первой попытки. Worker должен быть идемпотентным, иметь retry с backoff и dead-letter наблюдаемость.

Пользователь получает идентификатор операции и способ узнать состояние, а не обещание мгновенного завершения.

Наблюдаемость и приватность

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

Analytics продукта и operational telemetry имеют разные цели и политики согласия. На этом сервисе внешняя аналитика не загружается до accepted.

Практика главы

Возьмите список проектов с количеством задач. Предположите N+1, добавьте измерение числа SQL-запросов, предложите read query и кеш. Опишите ключ, TTL и инвалидирование.

Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

Перелинковка со справочником

Проверка актуальности

  • dev.mysql.comhttps://dev.mysql.com/doc/refman/8.4/en/Первичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

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

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie