У меня есть процесс репликации данных, который постепенно извлекает данные из внешнего источника через API. Иногда этот процесс приводит к пропущенным данным из-за состязаний, ошибок источника и т. Д. c. Чтобы проверить процесс, я хотел бы сравнить число строк за все более и более короткие периоды времени, пока я не укажу дату, с которой произошло расхождение, и воспроизвести только эту дату. Я не могу получить количество строк, агрегированных по дате для всех дат, программно, я могу указать только один диапазон, и мне нужно ограничить свои вызовы API.
Поток процесса должен по существу следовать:
- Сравнить количество строк от начала до даты. В случае несоответствия:
- Сравните количество строк для каждого года (или периода в 365 дней) в диапазоне от начала до даты. Пропустите этот шаг, если начальный период дат менее 1 года. Если несоответствие сохраняется:
- Сравните количество строк для каждого месяца (или периода в 30 дней) в текущем году с несоответствием. Если несоответствие сохраняется:
- Сравнить количество строк для каждой недели (или периода в 7 дней) в текущем месяце. Если несоответствие сохраняется:
- Сравните количество строк для каждого дня текущей недели. Дата с несоответствием должна быть повторена.
Мне не удалось найти элегантное решение этой проблемы, это лучшая попытка, которую я до сих пор делал:
def backfill(start_ts: datetime.datetime, end_ts: datetime.datetime, replicate_process: typing.Callable, audit_process: typing.Callable) -> bool:
brackets = [365, 30, 7, 1]
funnel = [(end_ts - start_ts).days]
funnel = sorted([i for i in brackets if i > funnel[0]], reverse=True)
audit_bool = False
increment_start = start_ts
increment_end = end_ts
while increment_start < increment_end:
while not audit_bool:
for days in funnel:
audit_bool, increment_start, increment_end = audit_process(days, increment_start, increment_end)
if days == 1:
replicate_process(increment_start, increment_end)
Мне еще предстоит выяснить, как работать в l oop над заданным диапазоном c для каждого шага процесса и как решить, когда Audit_process, возвращающий true, означает выход из l oop, вместо продолжения.
Это проблема с идиоматическим c объектно-ориентированным шаблоном проектирования, о котором я не знаю? Мне кажется, что это инверсия экспоненциального отката, когда вы пытаетесь экспоненциально уменьшить периоды времени до тех пор, пока период не станет равным 1. Хотя в этом случае шкала представляет собой представление даты.