Python 健全性检查:使用django的日期驱动事件处理程序

Python 健全性检查:使用django的日期驱动事件处理程序,python,django,Python,Django,我正在构建一个客户培育应用程序,当订单满足某些基于时间的条件时,该应用程序将发送一封电子邮件,例如: 50%的订单发货时间已过 订单发货日期后10天 订阅人注册日期后5天 我正试图确定如何最好地发射和处理这些事件。我没有处理这个问题的经验,所以任何意见都是非常感谢的 当前的想法是:轮询每个处理程序的匹配项,并确保每个处理程序匹配组合只通过一个额外的表触发一次。在这种情况下,我不会触发我可以在别处侦听的事件,每个处理程序都在执行自己的查询。在…后5天内,上的3个处理程序将触发3个查询 # b

我正在构建一个客户培育应用程序,当订单满足某些基于时间的条件时,该应用程序将发送一封电子邮件,例如:

  • 50%的订单发货时间已过
  • 订单发货日期后10天
  • 订阅人注册日期后5天
我正试图确定如何最好地发射和处理这些事件。我没有处理这个问题的经验,所以任何意见都是非常感谢的

当前的想法是:轮询每个处理程序的匹配项,并确保每个处理程序匹配组合只通过一个额外的表触发一次。在这种情况下,我不会触发我可以在别处侦听的事件,每个处理程序都在执行自己的查询。在…后5天内,
上的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任务,而不是处理程序,但我认为我必须跟踪触发的每个事件,以确保不触发2个事件,或者不跳过一个事件(例如,由于停机而跳过20%的事件)。这将比已启动但感觉更像真正的事件发射器的记录处理程序多存储数千条记录。

我将创建一个django管理命令来执行您需要的任何处理,然后分配一个cronjob来定期执行它


然后,您可能需要一个模型来跟踪是否满足/处理了条件,以及/或者哪些记录触发了事件

Django async是一个异步执行队列。您可以安排一个将来的事件,然后检查该条件当时是否有效。例如,当订单发货时,安排一个10天后触发的事件,当该事件执行时,可以在发送电子邮件之前确定任何其他条件


Django async内置了run once行为,如果队列因任何原因停止,它将在重新启动时赶上过去的作业。暂时性错误(如SMTP服务器关闭)将自动重试。

这是一个有趣的想法。。。为了在时间点安排特定事件,我可以测量“订单完成+1天+2天+3天”,这将使事件计数保持在最小值。唯一的问题是,如果我引入新事件,它将需要对所有已经通过其主要事件生成点的对象进行同步。此外,如果修改了该对象,这将更改事件(目标发货日期+2周),则这些事件会突然不准确。是否有其他更可靠的解决方案来生成此类事件?如果数据发生更改,您将安排一个新事件,并且当较早的事件触发时,它应该检查数据是否符合预期。如果不是,那么它什么也没做。有趣。所以我们在每个事件中都进行了验证。计划每次修改对象时基于时间的事件。过时的事件将无法通过验证,并且什么也不做。阿格!我喜欢这一点,但已经开始为基于处理程序的系统实现一个框架,如果处理程序很少,并且有一系列未预定义的条件,那么这个框架似乎工作得更好。谢谢你的好主意。我会接受的。谢谢你的意见——这正是我的帖子所建议的。轮询处理程序,而不是事件。