740fd2d7bd
repository map zavoz
2.1 KiB
2.1 KiB
5. Критичный путь
Decide (apps/decision/services.py)
flagиз cache/DB.active_experimentиз cache/DB.- Формируется cache key результата (
flag,subject, digest атрибутов, ревизииflag/experiment). - При cache hit возвращается тот же outcome/reason/value с новым
decision_id. - При cache miss выполняются проверки: running experiment, targeting, participation limits, domain conflicts, traffic allocation.
- Если назначен вариант, выбирается детерминированно по hash + weights.
- Результат может быть закэширован (по whitelist reason).
- Запись
Decisionзависит отDECISION_WRITE_MODE:sync|async|disabled; дляexperiment_assignedзапись всегда sync.
Reason-коды: flag_not_found, no_active_experiment, targeting_mismatch, participation_limit, domain_conflict, outside_traffic_allocation, no_variants, experiment_assigned.
Events (apps/events/services.py)
- Валидация типа события и payload.
- Дедуп по
event_id. - Exposure:
Exposure+Event, затем промоцияPendingEvent. - Conversion: при
requires_exposure=Trueбез exposure ->PendingEvent(TTL 7 дней), иначе attributedEvent.
Reports (apps/reports/services.py)
- По каждому варианту:
exposures,unique_subjects, значения выбранных метрик. - Поддерживается период
start/end. averageсчитает DBAvg,percentile- DB aggregate (PERCENTILE_CONTв PostgreSQL).- Связь событий с экспозициями строится через
Subquery, без materialization спискаdecision_idsв Python.
Guardrails (apps/guardrails/services.py)
- Celery проверяет running эксперименты.
- При breach:
GuardrailTrigger+ действие (pause/rollback) +ExperimentLog+ enqueue уведомления.