Зачем: собранная спека заказов стала базовой документацией сервиса, а жанр спеки-события ей мал: дата в имени врёт, целиком в контекст агента она не влезает, а трекер с резолюциями долговечным хранилищем не считается. Решение владельца — держать детальное устройство компонента связным набором живых документов (ADR 0011) и совместить переезд с проходом на вычитание (#84). Что: docs/architecture/orders/ — индекс README и файлы по частям устройства: проекция, слепок и доставка, судьба, классы расхождений, опись, мост к склейке, стартовый мир, правила кода; спека приёма переехала в ingestion.md без содержательных правок. Резы вычитания по итогам двух слепых линий: тела разделов о проводе и приёме сведены к указателям на мастер-спеку, исследование формата и ADR (порядок строк слепка — единственное правило, оставшееся на месте); замеры канонического зерна и повторы-пояснения срезаны; списки отклонённых вариантов сохранены как долговечная запись. Датированные файлы удалены, ссылки из мастер-спеки, спеки генератора, ADR 0008/0010, исследования формата и storage.md перенацелены; раздел «Структура» AGENTS.md дополнен правилом подпапки. Проверка: grep по репозиторию не находит ссылок на удалённые файлы; все относительные ссылки внутри набора разрешаются в существующие файлы; впереди холодная сверка «ни одно решение не потеряно» и приёмка #88. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3.1 KiB
ADR 0010. Заказы в ODS: версии сущности вместо подмены слепка
Дата: 16 августа 2026 года. Статус: принято. Частично заменяет ADR 0008.
Решение
Пакетный забор заказов остаётся прямым чтением байтового Kafka-чтеца по
команде Airflow, но порция чтения больше не считается полным слепком и не
публикуется заменой партиции snapshot_date. Прочитанные строки получают
_load_id запуска, разбираются из одного среза STG в годные строки и ошибки,
а ods.order_snapshot хранит принятые версии заказа в
ReplacingMergeTree(updated_at). Ключ сущности — order_id, партиция строится
от неизменного created_at, все версии ключа направляются на один шард.
snapshot_date остаётся датой наблюдения источника, _load_id — координатой
запуска приёма, _load_ts — временем прибытия строки. Ни одна из них не
заменяет бизнес-версию updated_at. Физическая таблица может показывать
несколько версий; точное текущее состояние ODS открывает ods.order_v, которое
скрывает FINAL или равносильный способ выбора последней версии.
Модель заказа в DDS этим решением не задаётся. DDS получает устойчивую типизированную поверхность ODS и отдельно решает зерно, связи и способ материализации своей модели.
Почему отменена подмена партиции
Прямой SELECT Kafka Engine заканчивается после одной полученной порции, а
протокол не несёт признака конца слепка. Поэтому snapshot_date не доказывает,
что в STG собрана полная партиция, и её подмена могла бы удалить уже принятые
версии прошлого дня. Маркер конца, опись или фиксация конечных офсетов сделали
бы границу настоящей, но добавили бы новый протокол без нужного стенду урока.
Малый объём позволяет оставить одно чтение на запуск как проверяемое эксплуатационное допущение, а не границу полноты. Полный контракт разбора, граница брака и поведение повторов заданы в спецификации приёма заказов.