ADR-001: инвалидация edge-кэша через signed purge URLs
Контекст
У нас 12 кампусов клиентов, каждый со своим origin и набором edge-точек присутствия. Когда контент меняется (редактор публикует новый кейс, админ обновляет цену) — нужно прицельно сбросить кэш только для затронутых ключей, без полного flush. Полный flush на пике = ~38 сек проседания LCP по всем тенантам.
Варианты
- A. Tag-based invalidation через webhook на CDN (Cloudflare/Fastly). Требует enterprise-тариф у Cloudflare.
- B. TTL-only — короткий TTL (30 сек), без явной инвалидации. Простота, но согласованность видна с задержкой.
- C. Push на каждый edge через broker (Kafka → edge workers). Сложность инфраструктуры.
- D. Signed purge URLs — клиент сам инициирует purge с HMAC-подписью. Без enterprise CDN, минимум зависимостей.
Решение
Вариант D. Backend-сервис генерирует одноразовый URL вида /__purge/<tenant>/<keys>?sig=<HMAC>. Edge worker валидирует подпись и сбрасывает локальный кэш по ключам. TTL подписи — 60 сек, защита от replay.
Последствия
- Плюс: работает на любом CDN, который поддерживает workers (Cloudflare, Fastly, bunny.net).
- Плюс: latency инвалидации ~150 мс по миру.
- Минус: нужно реализовать coordinated purge при multi-region — иначе кэш одной точки отстаёт.
- Минус: rotating HMAC ключей сложнее, чем у тег-based решения.