如何使用 Kue 处理计划的重复性作业



在我的 Web 应用程序中,用户可以创建需要在每个月的特定日期生成和发送的定期发票。例如,可能需要在每个月的 5 日发送发票。

我正在使用 Kue 来处理我所有的后台作业,所以在这种情况下我也想这样做。

我目前的解决方案是使用setInterval()每小时创建一个processRecurringInvoices作业。然后,此作业将从数据库中查找所有定期发票,并为每个定期发票创建单独的generateInvoice作业。

然后,generateInvoice作业将实际生成发票,如果需要,还将依次创建一个将通过电子邮件发送发票的sendInvoiceToEmail作业。

目前,这个解决方案对我来说看起来不错,因为它有一个很好的关注点分离,但是,我有以下问题:

  1. 不确定我是否应该等待所有"子"作业完成,然后再在主processRecurringInvoices作业上调用 done()?
  2. 我应该在哪里处理错误?我应该将它们传递回processRecurringInvoices作业,还是应该为每个作业单独处理它们?
  3. 如何确保如果处理需要额外的时间(超过一个小时),并且processRecurringInvoices或任何子作业仍在运行,则不会再次创建processRecurringInvoices作业?有点像一份独特的工作,还是相互排斥?
  1. 与其"处理定期发票",不如将其视为启动其他单独发票处理作业的作业。这样想,一旦发票处理作业排队,您就可以安全地在启动它们的作业上调用 done()。
  2. 以问题 1 中所述的方式考虑问题,应在每个单独的发票处理作业中处理错误。如果在查找潜在发票作业时出错,则可能会在流程中处理定期发票作业。
  3. 您可以使用kue.Job.rangeByType()搜索当前活动的作业。如果作业处于活动状态,则可以跳过再次启动它。

最新更新