在我的 Web 应用程序中,用户可以创建需要在每个月的特定日期生成和发送的定期发票。例如,可能需要在每个月的 5 日发送发票。
我正在使用 Kue 来处理我所有的后台作业,所以在这种情况下我也想这样做。
我目前的解决方案是使用setInterval()
每小时创建一个processRecurringInvoices
作业。然后,此作业将从数据库中查找所有定期发票,并为每个定期发票创建单独的generateInvoice
作业。
然后,generateInvoice
作业将实际生成发票,如果需要,还将依次创建一个将通过电子邮件发送发票的sendInvoiceToEmail
作业。
目前,这个解决方案对我来说看起来不错,因为它有一个很好的关注点分离,但是,我有以下问题:
- 我
- 不确定我是否应该等待所有"子"作业完成,然后再在主
processRecurringInvoices
作业上调用 done()? - 我应该在哪里处理错误?我应该将它们传递回
processRecurringInvoices
作业,还是应该为每个作业单独处理它们? - 如何确保如果处理需要额外的时间(超过一个小时),并且
processRecurringInvoices
或任何子作业仍在运行,则不会再次创建processRecurringInvoices
作业?有点像一份独特的工作,还是相互排斥?
- 与其"处理定期发票",不如将其视为启动其他单独发票处理作业的作业。这样想,一旦发票处理作业排队,您就可以安全地在启动它们的作业上调用 done()。
- 以问题 1 中所述的方式考虑问题,应在每个单独的发票处理作业中处理错误。如果在查找潜在发票作业时出错,则可能会在流程中处理定期发票作业。
- 您可以使用
kue.Job.rangeByType()
搜索当前活动的作业。如果作业处于活动状态,则可以跳过再次启动它。