fix(flags): added cache invalidation
This commit is contained in:
+3
-2
@@ -14,7 +14,7 @@
|
||||
| ADR-08 | Conflict domains (`mutual_exclusion`, `priority`) | Детерминированное разрешение пересечений экспериментов | Дополнительные проверки на старте и в decide |
|
||||
| ADR-09 | Базовая observability (`health`, `ready`, `/metrics`, JSON logs) | Проверяемость B9 и эксплуатационная диагностика | SLA readiness подтверждается только live-demo |
|
||||
| ADR-10 | Проверка качества через `just` и автотесты | Воспроизводимая верификация B1/B8/B10 | - |
|
||||
| ADR-11 | Кэш результата `decide` в cache backend (Redis/Valkey в целевом окружении) | Снизить CPU/DB в hot-path | Ниже latency на повторяющихся запросах; риск stale-ответа в рамках TTL |
|
||||
| ADR-11 | Кэш результата `decide` в cache backend (Redis/Valkey в целевом окружении) | Снизить CPU/DB в hot-path | Ниже latency на повторяющихся запросах; stale-риск снижен revision-aware cache key и инвалидацией `flag:{key}` при обновлении default |
|
||||
| ADR-12 | Режим записи `Decision`: `sync\|async\|disabled`; async через `events.persist_decision`; `experiment_assigned` всегда sync | Снять write-pressure с hot-path без потери атрибуции | В `async` режиме нужна стабильность broker/worker и мониторинг очереди |
|
||||
| ADR-13 | RBAC через роли `admin/experimenter/approver/viewer` + JWT bearer + endpoint guards | Выполнение требований доступа и ревью-ответственности из раздела 0 ТЗ | Вся авторизация централизована в role guards; нужен контроль качества секретов JWT в окружении |
|
||||
| ADR-14 | Типизированные feature flags (`string/boolean/integer`) и публичный контракт обновления только `default_value` | Исключить несогласованные значения флагов и обеспечить безопасные переключения без релиза | Смена `key/value_type` решается созданием нового флага и миграцией использования |
|
||||
@@ -33,12 +33,13 @@
|
||||
- Для `requires_exposure=True` событие без exposure не атрибутируется сразу: уходит в `PendingEvent`, промотируется после прихода exposure, затем очищается по TTL.
|
||||
- Одна метрика не может быть прикреплена к эксперименту дважды (`unique_experiment_metric`).
|
||||
- `Learning` хранится в one-to-one связи с экспериментом.
|
||||
- После `FeatureFlag.default_value` update удаляется cache key `flag:{key}`; следующий `decide` читает актуальный flag из DB.
|
||||
|
||||
## Ключевые риски
|
||||
|
||||
| Риск | Проявление | Смягчение | Остаток |
|
||||
|---|---|---|---|
|
||||
| Stale ответ из кэша `decide` | Кратковременный возврат устаревшего результата в пределах TTL | Revision-aware cache key + короткий TTL | Низкий/средний |
|
||||
| Stale ответ из кэша `decide` | Кратковременный возврат устаревшего результата в пределах TTL | Revision-aware cache key + инвалидация `flag:{key}` при update default + короткий TTL | Низкий |
|
||||
| Потеря throughput при проблемах Celery в `async` | Очередь растёт, запись `Decision` отстаёт | Режимы `sync|async|disabled`, force-sync для `experiment_assigned`, fallback на sync при ошибке enqueue | Средний |
|
||||
| Тяжёлые запросы отчётов на больших данных | Рост latency для percentile/агрегаций | DB aggregate + `Subquery`, фильтрация attributed событий, индексы | Средний |
|
||||
| Потеря отложенных атрибуций | `PendingEvent` истекает до прихода exposure | TTL 7 дней + cleanup + промоция при exposure | Средний |
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
## Decide (`apps/decision/services.py`)
|
||||
|
||||
1. `flag` из cache/DB.
|
||||
1. `flag` из cache/DB; при `FeatureFlag.default_value` update удаляется `flag:{key}`.
|
||||
2. `active_experiment` из cache/DB.
|
||||
3. Формируется cache key результата (`flag`, `subject`, digest атрибутов, ревизии `flag/experiment`).
|
||||
4. При cache hit возвращается тот же outcome/reason/value с новым `decision_id`.
|
||||
|
||||
Reference in New Issue
Block a user