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

2.4 KiB
Raw Blame History

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);