Потери на границе водяного знака
Вопрос
Инкрементальная загрузка берёт updated_at > :last_watermark, где водяной знак равен максимальному updated_at прошлой выгрузки. Изредка пропадают строки. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- PostgreSQL округляет
timestampдо секунд, и строки внутри одной секунды после границы теряются - Водяной знак нужно хранить в XCom, а не в таблице: иначе параллельные запуски DAG перезаписывают его друг у друга
- Строки с тем же
updated_atили закоммиченные позже с ранней меткой не попадают; нужно перекрытие и upsertправильный ответ - Выгрузку нужно сортировать по первичному ключу, иначе часть страниц при чтении пропускается
Разбор
Метка времени присваивается в момент изменения, а видимой строка становится при коммите. Долгая транзакция может закоммитить строку с меткой ниже уже сдвинутого водяного знака, а строки с одинаковым временем делятся границей. Перекрытие окна возвращает их, а upsert гасит повторы. PostgreSQL хранит микросекунды. Место хранения водяного знака проблему не решает. Сортировка выгрузки не меняет условие отбора.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «CDC и инкрементальная загрузка»
- Удаления в аналитике
- Событие Debezium
- Transactional outbox
- Инкремент по водяному знаку
- Применить события Debezium к состоянию
- Поле op в событии Debezium
- Удаления при инкременте по updated_at
- Спроектируйте репликацию данных сервисов в хранилище через CDC