Рекурсивный аудит меньших периодов времени для выявления источника несоответствия - PullRequest
0 голосов
/ 04 марта 2020

У меня есть процесс репликации данных, который постепенно извлекает данные из внешнего источника через 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. Хотя в этом случае шкала представляет собой представление даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...