Кэширование и производительность
Что можно кэшировать
GET /v3/streams— 30–60 секунд. Содержит каталоги, которые не меняются мгновенно.GET /v2/mini-player/stream— 15 секунд. Deep link не меняется чаще.GET /v3/translation/quick-state— рекомендуется не кэшировать, иначе потеряете мгновенные обновления.
Стратегии
- Edge-кэш: используйте CDN (Cloudflare, Fastly) с respect к query-параметрам (
feedProductId,categoryId,limit,offset). Важно: не кэшируйте заголовокAuthorization, иначе токены могут утечь. - Application-кэш: в бэкендах храните только поле
body, но прокидывайтеserverTimeдля понимания свежести данных. - Soft refresh: обновляйте UI из кэша, но параллельно отправляйте фоновой запрос и сравнивайте
serverTime.
Безопасность кэширования
Никогда не кэшируйте ответы на уровне CDN с учётом заголовка Authorization. Это может привести к утечке токенов между клиентами. Используйте backend proxy для кэширования с Bearer токенами.
Примеры cache-key
| Эндпоинт | Cache key | TTL |
|---|---|---|
GET /v3/streams | streams:{applicationId}:{categoryId}:{limit}:{offset} | 30–60 сек |
GET /v2/mini-player/stream | miniplayer:{application}:{feedProductId} | 15 сек |
GET /v3/translation/quick-state | не кэшировать | — |
Валидация JSON-конверта
function unwrap(response) {
if (response.status !== 200) {
throw new Error(`Transport error ${response.status}`);
}
const { status, body, serverTime } = response.data;
if (status !== 200 && body?.error) {
const err = new Error(body.message || body.error || 'ShopStory API error');
err.code = body.error;
err.serverTime = serverTime;
throw err;
}
return { body, serverTime };
}
Отладка
- При работе с CDN логируйте заголовок
X-Response-From-Application-Cache-Header. - Сохраняйте
serverTimeи сравнивайте его между ответами, чтобы отслеживать задержки в попадании данных. - Используйте PageSpeed/LightHouse, чтобы убедиться, что ваш фронтенд не блокируется лишними запросами.