Перейти к основному содержимому

ADR-0057: Статистика просмотров для застройщиков — контекст dev-stats на ClickHouse (3 года)

Статус

Accepted

Дата

2026-07-13

Контекст

Застройщику нужны метрики внимания к его недвижимости: кто, сколько, как долго и как часто смотрит его проекты / здания / планировки / группы планировок / объекты — с графиками и фильтрацией: обязательно по дате и застройщику (самому себе), как минимум по проекту; опционально по зданию, планировке, группе планировок, конкретному объекту. Глубина хранения — 3 года.

PostgreSQL-модель user-activity (ADR-0054/0056) — операционная (открытые сессии/просмотры, закрытие polling-ом); для 3-летнего массива фактов просмотров с произвольными агрегациями она не подходит. ClickHouse уже легитимен в системе (история цен, ТЗ.md:203–208) и поддержан SDK (Talent.Common.Infrastructure.DataBase.ClickHouse, linq2db + мигратор).

Решение

  1. Новый контекст dev-stats (аналитика застройщика): consumer событий user-activityClickHouse facts → API метрик/графиков для ЛК застройщика.
  2. Поток данных: pin.user-activity.lot-view-ended.v1 (+session-ended для сессионных метрик) → консюмер dev-stats обогащает просмотр измерениями из chessboard (DeveloperId, ProjectId, BuildingId, LayoutGroupId, LayoutId, LotId — реплика-справочник измерений) и типом зрителя (гость/инвестор/агент/менеджер) → вставка facts батчами (append-only, идемпотентность по ViewId/SourceEventId).
  3. Fact-таблица lot_view_facts (ReplacingMergeTree по dedup-ключу):
    • PARTITION BY toYYYYMM(ViewedAt);
    • ORDER BY (DeveloperId, ProjectId, BuildingId, LayoutGroupId, LayoutId, LotId, ViewedAt)ключ сортировки повторяет иерархию фильтров (подсказка по индексам): обязательные фильтры (застройщик → проект) — префикс ключа, опциональные (здание → группа планировок → планировка → объект) — продолжение префикса; диапазон дат режется партициями + ViewedAt в конце ключа;
    • TTL ViewedAt + INTERVAL 3 YEAR (авто-очистка, требование «отслеживать 3 года»);
    • меры: DurationSeconds, ViewerUserId/AnonymousId, ViewerKind, SessionId, ViewedAt.
  4. Агрегирующие materialized views (дневные rollup-ы по той же иерархии): views_count, unique_viewers (uniqCombined), total/avg duration, repeat_views — чтобы графики за месяцы/годы не сканировали сырые facts. FINAL в online-запросах запрещён (правило SDK).
  5. API dev-stats (Query-методы, area developers): временные ряды и сводки с группировкой день/неделя/месяц; фильтры: DateRange (обяз.), DeveloperId = из scope застройщика (обяз., только свои данные), ProjectId (мин. уровень), опционально BuildingId/LayoutGroupId/LayoutId/LotId; метрики: количество просмотров, уникальные зрители, суммарная/средняя длительность, частота повторных просмотров, разбивка по типу зрителя.
  6. Security: tenant-scope застройщика обязателен в каждом запросе (видит только себя); агрегаты не раскрывают персональные данные зрителей (ФИО/телефон недоступны — только типы/уникальные счётчики); доступ платформы (Менеджер ПИН/админ) — отдельные permissions.

Последствия

  • user-activity остаётся простым PostgreSQL-контекстом (ADR-0056); аналитическая нагрузка уходит в dev-stats/ClickHouse — уточнение ADR-0056: ClickHouse = история цен (invest-analytics) и view-статистика застройщиков (dev-stats); других применений без ADR не добавлять.
  • Нужна реплика измерений из chessboard (консюмер справочников) для обогащения facts.
  • ТЗ контекста пишется в Батче 4 (после user-activity, события которого потребляет); UC-префикс STA.

Обратные ссылки

Автоссылки: где используется этот документ.

Связанные документы

  • docs/06-services/dev-stats/ (детальное ТЗ), ADR-0054/0056, docs/99-templates/clickhouse-fact-template.md, SDK: Talent.Common.Infrastructure.DataBase.ClickHouse (+Migrator).