#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