теория
Лестница из задвоенных ставок появилась не из-за плохого скрипта — из-за конвейера, который боится повторов. А повторы будут всегда: сеть моргнула, поставщик перевыложил файл, парсер починили и надо переиграть месяц. Конвейер, который нельзя безопасно запустить второй раз, — это конвейер, который эксплуатирует человек, а не расписание.
Рецепт здесь тот же, что в девятнадцатом модуле, — с поправкой на внешний мир:
У каждой порции данных — детерминированный адрес. Не «дописать строки в конец таблицы», а «положить значения ряда X из файла Y за даты Z». Повторная загрузка того же файла кладёт те же значения по тому же адресу — и результат не отличается от однократной. Ключ порции: источник + ряд + дата наблюдения + версия файла.
Скачивание отдельно от разбора. Файл сначала фиксируется в сырье — с датой скачивания и контрольной суммой. Упал парсер — файл цел; перевыложили файл — в сырье появляется вторая версия, а не тишина. Из версий складывается история: «что присылал источник и когда» — запомни эту фразу, она скоро выстрелит.
Дозагрузка прошлого — тем же кодом. Подключая источник, мы забираем не только свежий бюллетень, но и архив за десять лет. Плохой конвейер для этого пишет отдельный «скрипт первоначальной загрузки» (который живёт один день и умирает без тестов); хороший — не отличает архивный файл от вчерашнего: тот же загрузчик, тот же адрес порции, та же проверка. Дозагрузка — это просто на большем интервале.
Есть и то, чего идемпотентность не решает: расписания. Инфляция публикуется двенадцатого числа в 16:00 — а иногда четырнадцатого в 11:00, потому что праздники. Конвейер не «качает раз в сутки», а знает календарь каждого источника: ждёт публикацию в её окно, терпеливо повторяет попытки, поднимает флаг «источник опаздывает» — и это флаг для людей и терминала, а не тихая дырка в ряду.