APScheduler пропускает задания и запускается в другое время

#python #azure #docker #kubernetes #apscheduler

#python #azure #docker #kubernetes #apscheduler

Вопрос:

У нас запущены кластеры Azure Kubernetes (по одному на этапе разработки, TST, PRD), где нам нужно периодически запускать несколько скриптов Python, для чего мы и используем APScheduler (3.6.0). Используется хранилище заданий в памяти по умолчанию.

Однако несколько дней назад я обнаружил, что APScheduler ведет себя не так, как ожидалось. Это происходит на всех трех этапах:

  • Конкретное задание, которое настроено на выполнение в минуту 0 и минуту 30 каждый час, перестало выполняться между 21:30 и 00:00 с 27 марта 2020 года.
  • Это же задание выполняется в странное время, например, в ~: 15 и: 45, часто.
  • Задания пропускаются, хотя они должны выполняться каждые 5 минут. В журнале указано «Запуск задания», но затем не указано следующее, что должно быть: Задание «x_job (триггер: cron[месяц =’‘, день = ‘‘, день_в_века =’‘, час = ‘‘, минута = ‘0,5,10,15,20,25,30,35,40,45,50,55’], следующий запуск в: 2020-08-18 10:35:00 UTC)» выполнено успешно . Случается, что в какой-то момент одновременно запускаются два запуска, но не обязательно следующий запуск.

Предпринятые шаги, но не с желаемым результатом:

Увеличьте количество process_pool_workers и thread_pool_max_workers и установите misfire_grace_time:

Исполнитель thread_pool_max_workers: 50 process_pool_max_workers: 20 Задания по умолчанию job_defaults_coalesce: True job_defaults_max_instances: 3 misfire_grace_time: 120

  • Установите часовой пояс = ‘UTC’ для планировщика и в add_jobs. планировщик = блокирующий планировщик (исполнители= executors, job_defaults= job_defaults, часовой пояс = ‘UTC’) scheduler.add_job(launch_profile_job, CronTrigger.from_crontab(scheduler_config.profile_job), часовой пояс = ‘UTC’)

Я также проверил ресурсы кластера, но процессор и память планировщика даже близко не соответствуют своим пределам. У нас также довольно низкое среднее количество активных модулей — 25, и даже если это стало бы проблемой для нашего кластера K8s, автоматическое масштабирование включено.

Кто-нибудь здесь имеет представление о том, что может происходить?

Ответ №1:

Не используйте хранилище заданий в памяти, вместо этого используйте хранилища сохраняемости, такие как Redis, mongo и т.д., Если вам нужно, чтобы ваши задания сохранялись при перезапусках планировщика или сбоях приложения, вы должны выбрать хранилища сохраняемых заданий.

APScheduler поддерживает следующие хранилища сохраняемых заданий.

  • SQLAlchemy
  • MongoDB
  • Redis
  • RethinkDB
  • ZooKeeper