我正在构建一个客户培育应用程序,该应用程序将在以下订单满足某些基于时间的条件时发送电子邮件:
50% OF Order time_to_ship elapsed
10 DAYS AFTER Order ship_date
5 DAYS AFTER NewsletterSubscriber signup_date
我试图确定如何最好地触发和处理这些事件。我没有处理这个问题的经验,所以感谢任何输入。
当前的想法:对每个处理程序的匹配进行轮询,并确保每个处理程序匹配组合仅通过额外的表触发一次。在这种情况下,我不会触发我可以在其他地方收听的事件,每个处理程序都在执行自己的查询。 5 days after ...
上的3个处理程序将触发3个查询。
# build table that stores which handlers have fired for a given object
class HandlerFired(models.Model):
ctype = models.ForeignKey(ContentType, related_name="handlerfired_ctype")
id = models.IntegerField()
handler = models.ForeignKey(Handler)
class Handler(models.Model):
ctype = models.ForeignKey(ContentType)
condition = ...
# cron job every day
for handler in Handler.objects.filter(is_active=True):
objects = handler.run_query().exclude(
handlerfired=handler, handlerfired_ctype=handler.ctype)
handler.handle(objects) # do whatever it's supposed to do with given objects.
# handle() would also make sure the `HandlerFired` table is populated with a record.
这个想法给了我比我开始项目时想象的更多的悲伤/选择。有时间驱动的事件似乎是一个非常普遍的问题。
或者,我可以做事件而不是处理程序的每日cron工作,但我认为我必须跟踪每个被解雇的事件,以确保我没有' t fire 2,或者没有跳过(因为停机时跳过了20%的事件)。这将比已经解雇的录制处理程序存储数千条记录,但感觉更像是真正的事件发射器。
答案 0 :(得分:4)
Django async是一个异步执行队列。您可以安排将来的事件,然后检查该条件是否有效。例如,当订单发货时,计划10天后触发的事件以及执行该事件时,可以在发送电子邮件之前确保其他任何条件。
http://pypi.python.org/pypi/django-async/
Django async内置了一次运行行为,如果队列因任何原因停止运行,它将在重新启动时赶上过去的作业。将自动重试瞬态错误(如SMTP服务器关闭)。
答案 1 :(得分:0)
我会创建一个django管理命令来执行您需要的任何处理,然后分配一个cronjob来定期执行它。
然后,您可能需要一个模型来跟踪是否已满足/处理条件,和/或哪些记录触发了该事件。