Bir modelim olduğunu varsayalım Event
. Etkinlik sona erdiğinde davet edilen tüm kullanıcılara bir bildirim (e-posta, push, ne olursa olsun) göndermek istiyorum. Çizgileri boyunca bir şey:
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")
Şimdi, elbette, önemli olan onEventElapsed
her an çağırmaktır timezone.now() >= event.end
. Unutmayın end
, geçerli tarihten aylar uzakta olabilir.
Bunu yapmanın iki temel yolunu düşündüm:
cron
Son beş dakika içinde herhangi bir olayın geçip geçmediğini kontrol eden ve yöntemimi yürüten periyodik bir iş (örneğin, her beş dakikada bir) kullanın.Gelecekte çalıştırılacak parametreyi kullanarak (modeller yöntemi dahilinde ) kullanın
celery
ve zamanlayın .onEventElapsed
eta
save
Seçenek 1 dikkate alındığında, potansiyel bir çözüm olabilir django-celery-beat
. Ancak, bir görevi bildirim göndermek için belirli bir aralıkta çalıştırmak biraz garip görünüyor. Ek olarak (muhtemelen) çok şık olmayan bir çözümle sonuçlanacak (potansiyel) bir sorunla karşılaştım:
- Son beş dakikada geçen olaylar için her beş dakikada bir kontrol edilsin mi? titrek görünüyor, belki bazı olaylar kaçırılır (ya da diğerleri bildirimlerini iki kez gönderir?). Potansiyel geçici çözüm:
True
bildirimler gönderildikten sonra modele ayarlanan bir boole alanı ekleyin .
Sonra tekrar, seçenek 2'nin de sorunları var:
- Bir olay başlangıç / bitiş tarihinin taşındığı durumla el ile ilgilenin. Kullanırken
celery
,taskID
tarihler değiştikten sonra (easy, ofc) depolamak ve görevi iptal etmek ve yeni bir görev vermek gerekir. Ama okudum, kereviz gelecekte yürütülecek görevlerle uğraşırken (tasarıma özgü) problemleri var: Github'da Açık Sayı . Bunun nasıl olduğunu ve neden çözülmesi önemsiz olan her şeyin olduğunu anlıyorum.
Şimdi, sorunumu çözebilecek bazı kütüphanelere rastladım:
- celery_longterm_scheduler (Ama bu daha önce olurdu gibi çünkü tiplerimiz Zamanlayıcı sınıfının, kereviz kullanamaz demektir? olası kullanım içine Bu da bağlar
django-celery-beat
... iki çerçeveler herhangi kullanarak, o (yani işleri sıraya hala mümkün biraz daha uzun sürüyor, ancak aylar değil mi?) - django-apscheduler , kullanır
apscheduler
. Ancak, uzak gelecekte yürütülecek görevleri nasıl ele alacağına dair herhangi bir bilgi bulamadım.
Buna yaklaşmamın temel bir kusuru var mı? Sahip olabileceğiniz herhangi bir giriş için memnunum.
Uyarı: Bunun muhtemelen bazı fikirlere dayanan bir fikir olduğunu biliyorum, ancak bazıları tarafından çirkin veya zarif olarak kabul edilebilecek ne olursa olsun kaçırdığım çok temel bir şey olabilir.