APScheduler отключился случайным образом

Планировщик работал нормально в продакшене, а потом внезапно отключился. Очевидно, что БД какое-то время находилась в автономном режиме (веб-приложения никогда не пропускали ни секунды, поэтому это было временно).

Журнал сообщил...

[2019-11-25 07:59:14,907: INFO/ercscheduler] Scheduler has been shut down
[2019-11-25 07:59:14,908: DEBUG/ercscheduler] Looking for jobs to run
[2019-11-25 07:59:14,909: WARNING/ercscheduler] Error getting due jobs from job store 'default': (psycopg2.OperationalError) could not connect to server: Network is unreachable
        Is the server running on host "localhost" (127.0.0.1) and accepting
        TCP/IP connections on port 6432?

(Background on this error at: http://sqlalche.me/e/e3q8)
[2019-11-25 07:59:14,909: DEBUG/ercscheduler] Next wakeup is due at 2019-11-25 13:59:24.908318+00:00 (in 10.000000 seconds)
[2019-11-25 07:59:14,909: INFO/ercscheduler] listener closed
[2019-11-25 07:59:14,909: INFO/ercscheduler] server has terminated
[2019-11-25 08:00:10,747: INFO/ercscheduler] Adding job tentatively -- it will be properly scheduled when the scheduler starts
[2019-11-25 08:00:10,797: INFO/ercscheduler] Adding job tentatively -- it will be properly scheduled when the scheduler starts
[2019-11-26 15:27:48,392: INFO/ercscheduler] Adding job tentatively -- it will be properly scheduled when the scheduler starts
[2019-11-26 15:27:48,392: INFO/ercscheduler] Adding job tentatively -- it will be properly scheduled when the scheduler starts

Как сделать планировщик более отказоустойчивым? Мне нужно снова перезапустить демона, чтобы он заработал.


person LiteWait    schedule 26.11.2019    source источник


Ответы (1)


Я нашел что-то очень похожее на вашу проблему в репозитории APScheduler Github. https://github.com/agronholm/apscheduler/issues/109

Эта проблема здесь, кажется, смягчена и объединена в version 3.3.

Все, что вам нужно сделать, это обновить как минимум до 3.3. Если вы хотите изменить 10-секундный интервал по умолчанию, вам необходимо установить jobstore_retry_interval при создании экземпляра планировщика.

Если вы не можете обновиться, я бы попробовал исправить соответствующую функцию в APScheduler.

def monkey_patched_process_jobs(self):

     # You have alter the way job processing done in this function.

     pass

# replacing the function with the patched one
BackgroundScheduler._process_jobs = monkey_patched_process_jobs

scheduler = BackgroundScheduler()

Имейте в виду, что это не идеально, я бы делал исправление обезьяны только в том случае, если я не могу обновиться из-за критических изменений.


Как эта функциональность работает под капотом

Это фрагмент из репозитория APScheduler Git.

try:
    due_jobs = jobstore.get_due_jobs(now)
except Exception as e:
    # Schedule a wakeup at least in jobstore_retry_interval seconds
    self._logger.warning('Error getting due jobs from job store %r: %s',
                         jobstore_alias, e)
    retry_wakeup_time = now + timedelta(seconds=self.jobstore_retry_interval)
    if not next_wakeup_time or next_wakeup_time > retry_wakeup_time:
        next_wakeup_time = retry_wakeup_time

    continue

self.jobstore_retry_interval устанавливается следующим образом:

self.jobstore_retry_interval = float(config.pop('jobstore_retry_interval', 10))
person Kristof Gilicze    schedule 02.12.2019
comment
Я бы предположил, что в журнале я увижу ошибку получения должных заданий из хранилища заданий, если это так. Возможно ли, что моя БД postgres находится в автономном режиме (скажем) более 10 секунд, и я использую значение по умолчанию или 10 секунд, и она просто прекращает обработку. Я бы хотел, чтобы планировщик НИКОГДА не прекращал попытки подключения к postgres, чтобы, если БД не рухнула, планировщик перезапустился. Это возможно? - person LiteWait; 09.03.2020