Каким образом можно эффективно организовать систему планирования заданий?

Какой планировщик задач лучше использовать для отправки пользователям в Telegram двух сообщений: одно за один день до определенной даты и другое за три часа до этой даты? Я использовал PostgreSQL для хранения даты, но хочу найти более оптимальное решение, так как в моей таблице даты могут значительно изменяться в диапазоне до трех месяцев. Я прочитал о Redis, но не до конца понял его возможности сохранения задач на диске. Что влияет на различное сохранение задач в Redis и какой подход лучше использовать в случае отключения сервера или сбоя Redis? Может быть, лучше сохранять все данные в базе данных или на диске?
  • 12 ноября 2023 г. 14:09
Ответы на вопрос 2
Для эффективной организации системы планирования заданий можно использовать следующие подходы:

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

2. Выбор планировщика задач: Исходя из требований, выберите подходящий планировщик задач. Некоторые популярные варианты включают Celery, Cron или библиотеку `schedule` для Python.

3. Интеграция с Telegram: Используйте Telegram API или API Telegram Bot для отправки сообщений пользователям.

4. Управление хранилищем данных: Выберите подходящее хранилище данных для сохранения задач. В случае с PostgreSQL, вы можете использовать его для хранения даты, однако, если ваши требования изменяются, и даты могут значительно меняться в диапазоне до трех месяцев, вам может потребоваться рассмотреть альтернативы, такие как Redis или база данных, подходящая для хранения временных данных.

5. Redis для сохранения задач: Redis является базой данных с открытым исходным кодом, специализирующейся на хранении данных в оперативной памяти. При правильной конфигурации, Redis также может сохранять данные на диск, чтобы предотвратить потерю данных при отключении сервера или сбое. Для сохранения задач в Redis можно использовать структуру данных, такую как Sorted Set, где время выполнения задачи будет служить весом, а сама задача будет ключом.

6. Альтернативные варианты хранения данных: Если требуется обеспечить более надежное хранение данных или вам необходимо поддерживать состояние между перезапусками сервера или сбоя Redis, вы можете рассмотреть другие варианты хранения данных, такие как внешние файлы или другие базы данных.

Конечный выбор подхода будет зависеть от ваших требований, доступных ресурсов и уровня надежности, которую вы хотите достигнуть.
Необходимо настроить автоматический запуск задачи в PostgreSQL по расписанию. Это можно сделать с помощью расширений или сторонних агентов, которые поддерживают синтаксис, аналогичный крону. Некоторые из них, такие как pg_agent, могут выполнить команды psql, включая вызовы внешних программ через COPY (SELECT text) TO PROGRAM '/bin/curl blablablabla...'. 
Если у вас уже есть скрипт на другом языке программирования, его можно запускать регулярно через крон. Внутри скрипта вы можете выполнить select и проверить, пришло ли время отправлять данные и куда их отправить.
Если количество данных велико (сто, тысяча, миллион), то для этого потребуется более сложное решение. В таком случае, можно использовать базу данных SQLite и написать скрипт на языке Bash.
Похожие вопросы