Files
Lotty/ADR/03-drivers-nfr.md
2026-02-24 23:53:33 +03:00

42 lines
2.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 3. Драйверы и NFR
## Корректность и воспроизводимость
- Детерминированная раздача варианта через SHA-256 hash по `subject_id` и `experiment_id`.
- Один активный эксперимент на флаг (`running/paused`) через DB constraint.
- Строгие переходы lifecycle и блокировка недопустимых переходов.
- Идемпотентность событий по `event_id`.
## Safety
- Guardrails с порогом, окном наблюдения и автоматическим действием (`pause` или `rollback`).
- Ограничение участия пользователя: max concurrent + cooldown.
- Conflict domains для детерминированного разрешения коллизий экспериментов.
## Целостность аналитики
- Атрибуция через `decision_id`.
- Для событий с `requires_exposure=True`: без exposure событие уходит в `PendingEvent` и промотируется позже.
- Отчёт строится по вариантам и выбранным метрикам эксперимента.
## Эксплуатация
- Health/readiness probes.
- Prometheus-инструментация HTTP и бизнес-счётчиков.
- Structured logging с correlation id.
- Регламентные фоновые задачи Celery.
## Производительность
Реализовано:
- кэш флагов и активных экспериментов;
- кэш результата `decide` (TTL через `DECISION_RESULT_CACHE_TTL_SECONDS`);
- режим записи `Decision`: `sync|async|disabled` (`DECISION_WRITE_MODE`) с принудительным sync для `experiment_assigned`;
- async persistence через `events.persist_decision`;
- `reports` считает `average` через `Avg`, `percentile` через DB aggregate (`PERCENTILE_CONT` для PostgreSQL);
- в `reports` убрана materialization `decision_ids`, используется `Subquery`.
Текущие ограничения:
- в режиме `async` устойчивость записи зависит от здоровья Celery worker/broker;
- SQL-ветка percentile зависит от СУБД (PostgreSQL/не-PostgreSQL fallback);