Этап 2: DDL и генератор #4

Closed
opened 2026-07-30 16:41:37 +03:00 by ddmitry · 2 comments
Owner

Part of #1

Цель этапа: собрать DDL событий ON CLUSTER и генератор клиентской стороны целиком (широкое событие, таксономия, анонимность, две куки на покупателя), наладить приём топика hits обеими нодами и зафиксировать маленький «зерновой» мир для стабильных приёмок следующих этапов.

Спека: docs/specs/2026-07-30-stand-v2-realism.md, разделы 1 и 5.

Минимальный критерий приёмки этапа: make up работает, smoke-проверки зелёные.

Блокируется: #3.

Этап начат с проектирования: спека генератора собрана и принята (тикет #14, карта #26), остальные тикеты нарезаны по ней. Спека генератора: docs/specs/2026-08-01-generator.md.

Дочерние тикеты

Порядок — это и есть цепочка блокировок (нативные зависимости Gitea); #37 и #38 идут параллельно после #36. После холодного ревью нарезки #37 расколот по шву STG/ODS: типизированный ODS выделен в #43.

6 августа 2026 года #41 и #43 переставлены местами. Раньше хранилище шло первым и пинило форму на проводе как первый потребитель, но платило за это дорого: событий в топике ещё нет, значит #43 пришлось бы выдумывать их своим модулем — вторым местом сериализации против правила «сериализатор один». Форма на проводе к тому времени и так записана словами (спека генератора, раздел 4), так что довод за обратный порядок отработал. Заодно три критерия переехали из #41 в #43: «день доезжает до ods.event», «*_errors пуст на честном прогоне» и «повтор не меняет счёт после дедупа» — это утверждения про хранилище, а не про сериализатор.

  • #14 — спека генератора: brainstorm → спека → нарезка
  • #36 — каркас генератора и контракт схемы события
  • #37 — DDL-бутстрап, топик hits и приём сырья в STG обеими нодами
  • #38 — план состава мира: зерно, приток, конфигурация
  • #39 — день-функция: трафик, сессии, pageview
  • #40 — торговые события
  • #50 — корзина отвязывается от страницы корзины, уровень спроса товара
  • #41 — сериализатор, приёмники и проигрыватель с CLI
  • #43 — типизированный ODS: ods.event, строгий приём и таблица ошибок
  • #42 — стартовый мир: опись мира и заливка при make up
Part of #1 Цель этапа: собрать DDL событий ON CLUSTER и генератор клиентской стороны целиком (широкое событие, таксономия, анонимность, две куки на покупателя), наладить приём топика `hits` обеими нодами и зафиксировать маленький «зерновой» мир для стабильных приёмок следующих этапов. Спека: docs/specs/2026-07-30-stand-v2-realism.md, разделы 1 и 5. Минимальный критерий приёмки этапа: `make up` работает, smoke-проверки зелёные. Блокируется: #3. Этап начат с проектирования: спека генератора собрана и принята (тикет #14, карта #26), остальные тикеты нарезаны по ней. Спека генератора: docs/specs/2026-08-01-generator.md. ## Дочерние тикеты Порядок — это и есть цепочка блокировок (нативные зависимости Gitea); #37 и #38 идут параллельно после #36. После холодного ревью нарезки #37 расколот по шву STG/ODS: типизированный ODS выделен в #43. 6 августа 2026 года #41 и #43 переставлены местами. Раньше хранилище шло первым и пинило форму на проводе как первый потребитель, но платило за это дорого: событий в топике ещё нет, значит #43 пришлось бы выдумывать их своим модулем — вторым местом сериализации против правила «сериализатор один». Форма на проводе к тому времени и так записана словами (спека генератора, раздел 4), так что довод за обратный порядок отработал. Заодно три критерия переехали из #41 в #43: «день доезжает до ods.event», «*_errors пуст на честном прогоне» и «повтор не меняет счёт после дедупа» — это утверждения про хранилище, а не про сериализатор. - [x] #14 — спека генератора: brainstorm → спека → нарезка - [x] #36 — каркас генератора и контракт схемы события - [x] #37 — DDL-бутстрап, топик hits и приём сырья в STG обеими нодами - [x] #38 — план состава мира: зерно, приток, конфигурация - [x] #39 — день-функция: трафик, сессии, pageview - [x] #40 — торговые события - [x] #50 — корзина отвязывается от страницы корзины, уровень спроса товара - [x] #41 — сериализатор, приёмники и проигрыватель с CLI - [x] #43 — типизированный ODS: ods.event, строгий приём и таблица ошибок - [x] #42 — стартовый мир: опись мира и заливка при make up
ddmitry added a new dependency 2026-07-30 16:51:38 +03:00
Author
Owner

Наблюдение ревьюера #12 — вход для DDL этого этапа.

Smoke-проверка кластера использует шаблон пути в keeper /clickhouse/tables/{shard}/<таблица> — без {database} и без {uuid}. Для двух временных таблиц проверки этого достаточно, но рабочие DDL слоёв, скопировав этот шаблон, столкнутся: одноимённые таблицы в разных базах получат один и тот же путь в keeper.

Решить при написании DDL: добавлять ли {database} в путь и использовать ли {uuid} (последний завязан на Atomic-движок базы и на default_replica_path).

Наблюдение ревьюера #12 — вход для DDL этого этапа. Smoke-проверка кластера использует шаблон пути в keeper `/clickhouse/tables/{shard}/<таблица>` — без `{database}` и без `{uuid}`. Для двух временных таблиц проверки этого достаточно, но рабочие DDL слоёв, скопировав этот шаблон, столкнутся: одноимённые таблицы в разных базах получат один и тот же путь в keeper. Решить при написании DDL: добавлять ли `{database}` в путь и использовать ли `{uuid}` (последний завязан на Atomic-движок базы и на `default_replica_path`).
ddmitry added the wayfinder:map label 2026-08-01 23:35:39 +03:00
Author
Owner

Этап принят 7 августа 2026 года.

Приёмка прогнана честно — не «оно вчера работало», а с нуля, и по планке
спеки (раздел 9 называет три цели поимённо), а не по формулировке этой карты:

Что Итог Время
make clean && make up с пустого стенда стартовый мир доехал: 401 185 событий 2 м 58 с
make smoke 20 проверок, ошибок 0 9 с
make check-clickhouse 9 из 9 8 с
make check-services 7 проверок, ошибок 0 59 с
make lint, make typecheck чисто
make test 407 пройдено 72 с

Все десять дочерних тикетов закрыты. Вход, висевший на карте с 30 июля
(наблюдение ревьюера #12 про путь в keeper), отработан: DDL слоёв берут
/clickhouse/tables/{shard}/{database}/{table}, {uuid} не взят, решение
записано в docs/architecture/storage.md.

Хвост спеки «Kafka Engine на двух нодах» закрыт решением, а не проверкой:
дубли и раскладку партиций между прогонами решено не проверять — дубль
возможен по устройству движка, а в ODS его схлопывает ReplacingMergeTree.
Решение и свежие замеры записаны в доки — PR #67.

Осталось жить рядом с этапом, но его не блокирует: #65, #63, #60, #48, #47.

Этап принят 7 августа 2026 года. Приёмка прогнана честно — не «оно вчера работало», а с нуля, и по планке спеки (раздел 9 называет три цели поимённо), а не по формулировке этой карты: | Что | Итог | Время | |---|---|---| | `make clean && make up` с пустого стенда | стартовый мир доехал: 401 185 событий | 2 м 58 с | | `make smoke` | 20 проверок, ошибок 0 | 9 с | | `make check-clickhouse` | 9 из 9 | 8 с | | `make check-services` | 7 проверок, ошибок 0 | 59 с | | `make lint`, `make typecheck` | чисто | — | | `make test` | 407 пройдено | 72 с | Все десять дочерних тикетов закрыты. Вход, висевший на карте с 30 июля (наблюдение ревьюера #12 про путь в keeper), отработан: DDL слоёв берут `/clickhouse/tables/{shard}/{database}/{table}`, `{uuid}` не взят, решение записано в `docs/architecture/storage.md`. Хвост спеки «Kafka Engine на двух нодах» закрыт решением, а не проверкой: дубли и раскладку партиций между прогонами решено не проверять — дубль возможен по устройству движка, а в ODS его схлопывает `ReplacingMergeTree`. Решение и свежие замеры записаны в доки — PR #67. Осталось жить рядом с этапом, но его не блокирует: #65, #63, #60, #48, #47.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Blocks
#5 Этап 3: заказы и каталог
ddmitry/clickstream-data-platform
Depends on
Reference: ddmitry/clickstream-data-platform#4