fix(clickhouse): починена проверка словаря, выметены хвосты переноса
Зачем: ревью в три линии нашло настоящий дефект. Девятая проверка кластера
звала dictGet('dds.products', …) — объекта после переноса не существует, и
make check-clickhouse падал. Промах вырос из недосчёта: упоминания dds.products
я искал с фильтром по расширениям, .sh туда не попал, и в ADR уехало «четыре
упоминания» вместо семи.
Что: проверка переведена на dic.products и сверяет цену, умножив её обратно на
сто, — так утверждается ещё и точность приведения к Decimal. Раздел 3
мастер-спеки и список пользователей README догнали перенос: оба описывали
отменённое устройство. В ADR 0012 добавлено условие пересмотра для дома — для
него его не было, хотя ради дома тикет и заводился; недосчёт записан в
«Что проверено» как урок. Разнобой обозначений сведён: карта таблиц в доке
хранилища перешла на имена баз строчными, таблица мастер-спеки — на заголовок
«Где», зону всюду зовут зоной, а не слоем. Термин «Справочник» переписан без
метафоры и уложен в формат глоссария. Вычтено лишнее: комментарии DDL
сократились вдвое, из ADR 0006 и 0007 убраны самооправдание и дублирующие
абзацы, отраслевой образец получил честную оговорку о непроверяемости.
Проверка: make config-test, make lint, make smoke и make check-clickhouse —
все зелёные, десять проверок кластера из десяти.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -33,18 +33,19 @@
|
||||
владение, которого у него нет: DDS этот объект не производит, не обновляет и не
|
||||
проверяет.
|
||||
|
||||
**На направление данных ссылаться нельзя, и это важно не спутать.** Чтение из
|
||||
DM объекта, лежащего в DDS, — течение вниз, ровно то, которое разрешено.
|
||||
Промах был во владении, а не в направлении. Но зона вне цепочки закрывает и
|
||||
будущий случай: как только справочник понадобится выше по течению — например,
|
||||
проверка `sku` позиции при разборе заказа в ODS, — чтение `dds.*` из `ods.*`
|
||||
стало бы настоящей инверсией. У зоны вне цепочки направления относительно слоёв
|
||||
нет, и такой запрос законен по построению.
|
||||
**Промах был во владении, а не в направлении.** Чтение из DM объекта, лежащего
|
||||
в DDS, — течение вниз, ровно то, которое разрешено; на инверсию слоёв это
|
||||
решение не опирается. Зато зона закрывает будущий случай: как только справочник
|
||||
понадобится выше по течению — скажем, проверка `sku` при разборе заказа в ODS —
|
||||
чтение `dds.*` из `ods.*` стало бы настоящей инверсией. У зоны вне цепочки
|
||||
направления относительно слоёв нет, и такой запрос законен по построению.
|
||||
|
||||
**Отраслевой образец говорит то же самое другим средством.** В хранилищах, где
|
||||
база одна, а слои выражены префиксами имён, справочники несут собственный
|
||||
префикс наравне с префиксами стадий — то есть образуют свой слой, а не
|
||||
приписаны к слою модели. Причём префикс накрывает всю цепочку справочника: и
|
||||
**Отраслевой образец говорит то же самое другим средством.** Владелец принёс
|
||||
устройство промышленного хранилища телекома — источник закрытый, проверить по
|
||||
ссылке нельзя, поэтому вес у довода такой же, как у полевого опыта, а не как у
|
||||
документации. Там база одна, слои выражены префиксами имён, и справочники несут
|
||||
собственный префикс наравне с префиксами стадий — то есть образуют свою зону, а
|
||||
не приписаны к слою модели. Причём префикс накрывает всю цепочку справочника: и
|
||||
таблицу, и представление над ней, и сам объект словаря. Средство разное,
|
||||
утверждение одно. У нас слои выражены базами — значит справочникам полагается
|
||||
база.
|
||||
@@ -82,8 +83,8 @@ DM объекта, лежащего в DDS, — течение вниз, ров
|
||||
**Историзацию и представление «последняя загрузка» из образца не берём.** В
|
||||
промышленном примере таблица копит загрузки с меткой времени, а представление
|
||||
берёт последнюю: источник приезжал извне, и версий у него не было нигде. У нас
|
||||
версии есть — **история каталога это и есть git**. Дублировать её в ClickHouse значит
|
||||
поставить конструкцию, у которой на стенде нет причины, а расшифровывать её
|
||||
версии есть — **история каталога это и есть git**. Дублировать её в ClickHouse
|
||||
значит поставить конструкцию, у которой на стенде нет причины, а расшифровывать её
|
||||
менти всё равно придётся.
|
||||
|
||||
**Материализованной таблицы с шагом наполнения тоже не берём.** Шаг наполнения
|
||||
@@ -121,6 +122,12 @@ DM объекта, лежащего в DDS, — течение вниз, ров
|
||||
|
||||
## Условия пересмотра
|
||||
|
||||
- **Дом.** Появляется справочные данные, которые хранилище производит само —
|
||||
скажем, таблица соответствий, собранная из DDS. Посылка решения «в хранилище
|
||||
их никто не производит» на них не распространяется, и зону придётся либо
|
||||
сузить до пришедших извне, либо переопределить. Дешевле всего это до этапа 4:
|
||||
как только витрины начнут звать словарь по имени, каждый разворот станет
|
||||
правкой по всем ссылкам.
|
||||
- Справочник перестаёт быть файлом репозитория и начинает приезжать извне —
|
||||
возвращается вопрос устройства: историзованная таблица, «последняя загрузка»,
|
||||
словарь поверх. Адрес это переживает.
|
||||
@@ -142,8 +149,8 @@ DM объекта, лежащего в DDS, — течение вниз, ров
|
||||
почти на все полторы минуты: одна перезагрузилась сразу после правки, вторая
|
||||
ещё нет. Прежнее решение `LIFETIME(0)` окно не закрывало, а сжимало до
|
||||
разброса исполнения `SYSTEM RELOAD DICTIONARY ON CLUSTER`; теперь оно
|
||||
раскрыто намеренно. Урок записан опорной точкой в мастер-спеке, тащить его в курс —
|
||||
отдельное решение.
|
||||
раскрыто намеренно. Урок записан опорной точкой в мастер-спеке, тащить его
|
||||
в курс — отдельное решение.
|
||||
- **Номенклатура товаров — медленно изменяющийся справочник**, и в предметной
|
||||
области это так. Стенд упрощает: файл в репозитории под версией git.
|
||||
Историзации в хранилище нет, и обещать её этот документ не должен.
|
||||
@@ -178,15 +185,25 @@ DM объекта, лежащего в DDS, — течение вниз, ров
|
||||
- `SHOW DICTIONARIES` без указания базы возвращает пусто; словарь в базе стоит
|
||||
среди таблиц слоя и отличается от них только колонкой движка в
|
||||
`system.tables`.
|
||||
- До переноса `dds.products` упоминался в репозитории четырежды, в дагах — ноль.
|
||||
- До переноса `dds.products` стоял в семи строках трёх файлов: дока хранилища,
|
||||
DDL словаря и проверка `scripts/check-clickhouse.sh`. Первый замер насчитал
|
||||
четыре и проверку не увидел — искали с фильтром по расширениям, куда `.sh`
|
||||
не попал. Из недосчёта вырос настоящий дефект: девятая проверка кластера
|
||||
осталась звать несуществующий объект и упала. Поймало ревью, не автор.
|
||||
Урок тот же, что в [ADR 0006](0006-object-naming.md): «прогнал по
|
||||
репозиторию» — такое же утверждение, как утверждение о поведении системы, и
|
||||
проверять его надо так же.
|
||||
- Движок `File` требует у `etl` права на источник. Отказ называет
|
||||
`TABLE ENGINE ON File`, но права с таким именем не хватает: замер тремя
|
||||
пользователями показал, что работает `GRANT FILE ON *.*`, а `TABLE ENGINE ON
|
||||
File` не нужен вовсе.
|
||||
- Стенд, собранный с нуля этим решением, поднимается зелёным: оба объекта зоны
|
||||
на месте, словарь `LOADED` со 180 строками, база `dds` пуста, `bi` читает
|
||||
словарь со второй ноды, `analyst` — подложку соединением. `make smoke` —
|
||||
20 проверок, 0 ошибок.
|
||||
словарь со второй ноды, `analyst` — подложку соединением. Словарь спрашивает
|
||||
`make check-clickhouse` — 10 проверок из 10; девятая берёт известный `sku` на
|
||||
обеих нодах и сверяет цену с колонкой файла, умножив её обратно на сто, так
|
||||
что приведение к `Decimal` проверено вместе с ответом. `make smoke` словарь
|
||||
не трогает вовсе.
|
||||
|
||||
Сверено по документации ClickHouse через MCP Context7 20 августа 2026 года.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user