我正在构建一个客户培育应用程序,当订单满足某些基于时间的条件时,它将发送一封电子邮件,例如:
50% OF Order time_to_ship elapsed
10 DAYS AFTER Order ship_date
5 DAYS AFTER NewsletterSubscriber signup_date
我正在尝试确定如何最好地触发和处理这些事件。我没有处理此问题的经验,因此感谢您提供任何意见。
当前想法:轮询每个处理程序的匹配项,并确保每个处理程序匹配组合仅通过一个额外的表触发一次。在这种情况下,我不会触发可以在其他地方收听的事件,每个处理程序都在执行自己的查询。3 个处理程序5 days after ...
将触发 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% 的事件,因为停机时间)。与已触发但感觉更像真正的事件发射器的记录处理程序相比,这将存储数千条记录。