Припустимо, у мене є модель Event
. Я хочу надіслати сповіщення (електронною поштою, надіслати, що завгодно) всім запрошеним користувачам, коли подія закінчиться. Щось у напрямку:
class Event(models.Model):
start = models.DateTimeField(...)
end = models.DateTimeField(...)
invited = models.ManyToManyField(model=User)
def onEventElapsed(self):
for user in self.invited:
my_notification_backend.sendMessage(target=user, message="Event has elapsed")
Тепер, звичайно, найважливіша частина - покликатись onEventElapsed
коли завгодно timezone.now() >= event.end
. Майте на увазі, end
може бути місяця від поточної дати.
Я подумав про два основні способи цього:
Використовуйте періодичне
cron
завдання (скажімо, кожні п’ять хвилин або близько того), яке перевіряє, чи не відбулися якісь події протягом останніх п’яти хвилин, і виконує мій метод.Використовуйте
celery
та плануйтеonEventElapsed
за допомогоюeta
параметра, який буде запущено в майбутньому (в рамкахsave
методу моделей ).
Розглядаючи варіант 1, можливим може бути рішення django-celery-beat
. Однак, здається, що дивно виконувати завдання через встановлений інтервал для надсилання сповіщень. Крім того, я придумав (потенційне) питання, яке (мабуть) призведе до не дуже елегантного рішення:
- Кожні п’ять хвилин перевіряйте, чи немає подій, що минули за попередні п’ять хвилин? здається хиткою, можливо, деякі події пропущені (або інші отримують свої повідомлення двічі?). Потенційне вирішення проблеми: додайте булеве поле до моделі, встановленої
True
після надсилання повідомлень.
Знову ж таки, варіант 2 також має свої проблеми:
- Вручну подбайте про ситуацію, коли переміщається дата початку / закінчення події. Під час використання
celery
потрібно зберігатиtaskID
(easy, ofc) і скасувати завдання, як тільки дати змінилися, і видати нове завдання. Але я читав, що у селери є проблеми (специфічні для дизайну) при вирішенні завдань, які виконуються в майбутньому: Open Issue на github . Я усвідомлюю, як це відбувається і чому вирішувати все, окрім як банального.
Тепер я зіткнувся з деякими бібліотеками, які потенційно могли б вирішити мою проблему:
- celery_longterm_scheduler (Але чи це означає, що я не можу використовувати селеру так, як це було б раніше, через різний клас Планувальник? Це також пов'язане з можливим використанням
django-celery-beat
... Використовуючи будь-яку з двох фреймворків, чи все-таки можна встановити чергу із завданнями (що трішки триваліший біг, а не місяці?) - джанго-апшедулер , використовує
apscheduler
. Однак мені не вдалося знайти будь-якої інформації про те, як вона буде справлятися із завданнями, які виконуються в далекому майбутньому.
Чи є фундаментальний недолік у тому, як я підходжу до цього? Я радий за будь-які матеріали, які ви можете мати.
Зауважте: я знаю, що це, мабуть, базується на якійсь думці, але, можливо, є дуже елементарна річ, яку я пропустив, незалежно від того, що хтось може вважати потворним чи елегантним.