Кеширование
SWR: тест с выбором ответа
Шесть вопросов поперёк всего юнита. Каждый отражает заголовок, который ты пишешь, или инцидент, который разбираешь — не директиву для заучивания, а компромисс «свежесть против задержки», который надо взвесить под реальным трафиком.
Убедись, что связываешь окно свежести, окно SWR, stale-if-error, single-flight и модель ревалидации на клиенте — и что знаешь единственное место, куда SWR ставить нельзя.
Запрос приходит через 90 секунд после кэширования, с Cache-Control: max-age=60, stale-while-revalidate=300. Что получит пользователь и почему?
Почему один лишь max-age порождает пилу p99 на каждой границе TTL, и как stale-while-revalidate её сглаживает?
Популярный ключ истекает при 10k rps, и edge запускает по одной фоновой ревалидации на каждый stale-hit. Что ломается и какой фикс?
Что stale-if-error добавляет поверх stale-while-revalidate, и почему пара — дефолт сеньора?
Два компонента вызывают useSWR('/api/user') в одном тике рендера. Что делает клиентская библиотека SWR и что этим управляет?
Для какого ответа stale-while-revalidate — неправильный инструмент и почему?
Сквозная линия — один контракт: верни то, что есть сейчас, подтяни то, что верно, следующим, и никогда не заставляй человека ждать обновления. max-age задаёт свежесть, окно SWR убивает пилу синхронной ревалидации, stale-if-error превращает аварию в degraded-but-up, single-flight плюс джиттер останавливают стадо фоновых обновлений, а клиентские библиотеки воспроизводят ту же модель через dedupingInterval и ревалидацию на focus/reconnect. Единственная жёсткая граница: никогда не применяй SWR к auth, правам и всему, где устаревшие данные — баг безопасности.