Какой инструмент лучше всего подходит для выполнения отложенных задач в роли worker?

Мне нужно разработать бота на aiogram для добавления событий и отправки уведомлений пользователям за некоторое время до указанной даты и времени события. Размышления о том, что использование eta и countdown в celery с redis в качестве брокера не рекомендуется для долгосрочного планирования, так как это может привести к большому использованию оперативной памяти и повторной доставке задач при превышении visibility_timeout. Какие альтернативные подходы вы предложите для решения этой проблемы? Требуется ли изменение воркера или брокера задач?
  • 1 августа 2024 г. 16:43
Ответы на вопрос 2
Для выполнения отложенных задач в роли worker в вашем случае лучше всего подойдет библиотека APScheduler, которая предоставляет удобный способ планирования и выполнения задач в Python. APScheduler позволяет создавать задачи с отложенным выполнением и устанавливать расписание их выполнения.

Для реализации функционала добавления событий и отправки уведомлений за некоторое время до указанной даты и времени события, вы можете использовать APScheduler для планирования отправки уведомлений за определенное время до события.

Необходимо добавить в вашего бота логику для создания задач в APScheduler при добавлении событий пользователем. Когда наступит время для отправки уведомления, APScheduler выполнит соответствующую задачу, которая отправит уведомление пользователю.

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

Никаких изменений воркера или брокера задач не требуется для использования APScheduler, так как он предоставляет собственный механизм планирования и выполнения задач.
Я бы вообще изобрёл велосипед, если честно. 
У тебя есть список или база активных (неслучившихся) событий. Пусть это будет пара ID-метка времени, остальная инфа нам без надобности.
При запуске бота выбираем из списка ближайшее событие, и вычисляем время ожидания (с небольшим запасом) и спим в корутине. В случае, если ожидание прервано раньше - повторяем то же самое, чтобы либо "доспать", либо переключиться на ожидание более близкого события.
Если же ожидание закончилось успешно, обрабатываем событие и снова повторяем поиск ближайшего события.
Если список событий изменился, прерываем текущее ожидание, чтобы корутина ожидания могла адаптироваться к изменениям.

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