docs(dds): зафиксирована физическая модель карты идентичностей
- Зачем: - согласованная модель нужна для пакетной реализации DDS и понятного публичного интерфейса слоя. - Что: - описаны физическая карта идентичностей, полный пересчёт и отказ от first_matched_at. - унифицирован публичный контракт _v для событий, заказов, сессий и карты. - синхронизированы мастер-спека, имена объектов и граница доступа. - Проверка: - git diff --cached --check.
This commit is contained in:
1 parent
256d51840b
commit
f0c4b4c627
7 files changed
+234
-59
No files matched your search
@@ -5,8 +5,8 @@
|
||||
свою нарезку с эталоном. Стенд здесь играет роль сессионизатора: в бою её
|
||||
играет Метрика, которая режет визиты у себя и с октября 2025 отдаёт готовый
|
||||
`VisitID` прямо в хитах. Поэтому стенд считает сессии сам, а `VisitID`
|
||||
генератора использует только как эталон самопроверки — иначе сборка
|
||||
`dds.session` выродилась бы в `GROUP BY` по чужому полю и центральный урок
|
||||
генератора использует только как эталон самопроверки — иначе сборка сессий
|
||||
выродилась бы в `GROUP BY` по чужому полю и центральный урок
|
||||
слоя пропал бы. Без этого абзаца действия стенда выглядят странно: «зачем
|
||||
считать то, что уже дано колонкой».
|
||||
|
||||
@@ -35,10 +35,10 @@
|
||||
ломают.
|
||||
|
||||
`session_id` — не ключ сортировки и не ключ шардирования, а колонка-ручка:
|
||||
витрины сессий читают таблицу напрямую, их зерно совпадает с зерном модели,
|
||||
и в соединениях id не участвует — события его не несут, мост к заказам живёт
|
||||
на событиях. Читатели ручки — лаба сессий (сопоставить свою нарезку со
|
||||
стендовой и назвать расхождение одним числом) и разбор DQ-расхождений.
|
||||
витрины сессий читают `dds.session_v`, их зерно совпадает с зерном модели, и в
|
||||
соединениях id не участвует — события его не несут, мост к заказам живёт на
|
||||
событиях. Читатели ручки — лаба сессий (сопоставить свою нарезку со стендовой и
|
||||
назвать расхождение одним числом) и разбор DQ-расхождений.
|
||||
|
||||
## Состав строки
|
||||
|
||||
@@ -64,10 +64,11 @@
|
||||
|
||||
## Движок и наполнение
|
||||
|
||||
`MergeTree` без колонки версии, по образцу заказа: партиция — день сессии,
|
||||
ключ сортировки — кука и начало сессии, шардирование распределённой таблицы —
|
||||
`cityHash64(ClientID)`, тем же выражением, что у событий, — ко-локация с
|
||||
`dds.identity_map` ([дока хранилища](../storage.md), «Раскладка по шардам»).
|
||||
`dds.session_rep` — `ReplicatedMergeTree` без колонки версии, по образцу
|
||||
заказа: партиция — день сессии, ключ сортировки — кука и начало сессии.
|
||||
`dds.session_dist` шардирует по `cityHash64(client_id)`, тем же выражением,
|
||||
что события, — это ко-локация с `dds.identity_map_rep` ([дока
|
||||
хранилища](../storage.md), «Раскладка по шардам»).
|
||||
Совпадение ключа с событиями не случайно: все события куки лежат на одном
|
||||
шарде, поэтому сессионизация локальна по природе — капкан смены ключа при
|
||||
вставке, который дока хранилища обещает сборкам DDS, у сессий не стреляет.
|
||||
@@ -78,10 +79,15 @@
|
||||
целиком; идемпотентность держит замена партиции. В отличие от заказов, где
|
||||
батч пересобирает до K «дышащих» дней, у сессий пересобирается только одна
|
||||
партиция: день самодостаточен и замерзает сразу (правило спеки, раздел 6).
|
||||
Внутри живого дня `dds.session` про сегодня честно молчит — «сегодня»
|
||||
Внутри живого дня модель сессии про сегодня честно молчит — «сегодня»
|
||||
смотрят через `dds.event_v`; сессия и по смыслу не финальна, пока день не
|
||||
прожит.
|
||||
|
||||
Публичная поверхность — `dds.session_v`: обычное представление с явным
|
||||
списком деловых и собственных служебных колонок над `dds.session_dist`.
|
||||
Роли объектов и доступ следуют общей [конвенции](../storage.md), «Имена
|
||||
объектов».
|
||||
|
||||
Источник сборки — `dds.event_v` ([контракт события](event.md)): сессии
|
||||
нужны от него ключи нарезки, тип события, страница, UTM и паспорт куки.
|
||||
Механика запуска — где собирается партиция и как подменяется на кластере —
|
||||
@@ -102,7 +108,7 @@
|
||||
## Читатели
|
||||
|
||||
- Витрина обзора сессий `session_overview_v`: длительности, глубина,
|
||||
вход/выход; читает таблицу напрямую, зерно совпадает (#135).
|
||||
вход/выход; читает `dds.session_v`, зерно совпадает (#135).
|
||||
- DQ-сверка с эталоном (см. выше).
|
||||
- Лаба сессий: менти собирает нарезку сам до знакомства с кодом стенда,
|
||||
потом сравнивает — с эталоном и со стендовой.
|
||||
@@ -124,9 +130,11 @@
|
||||
- **Гибрид: сборка по `VisitID`, DQ пересчитывает нарезку.** Сторож на
|
||||
нарезку, которой сборка не делает; та же работа, что в варианте «считать
|
||||
сам», но урок спрятан в проверку.
|
||||
- **Представление вместо таблицы.** Оконная сессионизация на каждое чтение;
|
||||
- **Одно динамическое представление вместо физической таблицы.** Оконная
|
||||
сессионизация на каждое чтение;
|
||||
урок «слой — контракт, а не копия» уже закреплён за `dds.event_v` — доводы
|
||||
модели заказа, здесь они только сильнее.
|
||||
модели заказа, здесь они только сильнее. Публичное `dds.session_v` поверх
|
||||
готовой физической модели ничего заново не считает.
|
||||
- **Счётчик или UUID вместо детерминированного хеша.** Пересборка партиции
|
||||
выдала бы другие id — замена перестала бы быть идемпотентной.
|
||||
- **`VisitID` колонкой в строке сессии.** Чужой чекан в своей модели: наша
|
||||
|
||||
Reference in new issue
Block a user