【问题标题】:Rescheduling cron jobs in nodejs on server restart在服务器重新启动时重新安排 nodejs 中的 cron 作业
【发布时间】:2020-09-16 03:43:23
【问题描述】:

我有 node js 应用程序,用户可以在其中安排 4-5 个不同的 cron 作业。用户选择 start_date、end_date、start_time 和 end_time,因此会安排 cron 函数并生成一些活动以与潜在客户(或其他用户)联系。我正在使用 npm 包 node-schedule 来实现所需的 cron 作业执行,但如果我的 Web 应用程序在两者之间崩溃,就会出现问题。

根据node-schedule的官方文档,

请注意,节点调度是为进程内调度而设计的,即调度作业只会在您的脚本运行时触发,并且在执行完成后调度将消失。

我能想出的解决方案是使用 server.js 文件调用 cron 函数,该文件在每次执行服务器脚本时都会重新启动。但我无法解决以下一些问题:

  1. 调度程序是一个单独的函数,不是特定于活动的,那么如果尚未完成,应用程序如何知道要启动哪个 cron 函数?
  2. 调度程序是一个单独的函数,每次服务器重新启动时都会调用该函数。如果创建了 6 个服务器实例,它将被调用 6 次。

假设,我的调度程序将在 5 月 28 日上午 11:00 到 5 月 31 日上午 12:00 之间执行。调度程序开始其工作,一些活动在其间执行。如果我的服务器在 5 月 30 日出现故障,我如何从剩余的日期时间和活动中提取并从那里完成?

所以我担心如何安排或处理活动的 cron 作业功能?如果任何活动 cron 作业在服务器停止时崩溃,我应该如何从剩余的时间或日期重新安排或执行该 cron 功能?

我对 cron 作业没有太多经验,希望有一些方便的解决方案。

【问题讨论】:

  • #1 您是否愿意对当前方法进行一些更改? #2 你的 crons 间隔是短的(每 5 分钟一次)还是每天一次? # 你能使用一些数据库吗? #3 这是概念验证还是实际需求?
  • @JRichardsz #1。是的,当然欢迎改变。 #2。 Cron 基于用户的活动。用户在一天中的任何时间选择输入日期时间,然后他选择一批用户的电子邮件来安排电子邮件发送。通过这种方式,用户可以根据选定的日期时间为不同的批次安排多个 cron 作业。 #3 这是我真正的需求,我需要帮助来实现。

标签: node.js mongoose cron


【解决方案1】:

这里有一些建议,您可以根据自己的硬件能力查看或实施:

解耦

将您当前的应用程序分解为两个独立的工件:网络和广告系列。这允许独立部署、重建、重新部署和管理每个服务。并且还拥有自治或跨职能团队。

来源:https://skelia.com/articles/5-major-benefits-microservice-architecture/

容错

如果您需要一个不影响故障、崩溃或任何需要重启的事件的应用,您必须在应用之外使用 something

通常这个外面是一个数据库。如果数据库不适合您,您可以使用 json 文件。

广告系列

我们这里有两个实体:

campaign_configurations

| identifier | desc | cron_expression | |-------------------|----------------|-----------------| | month_discounts | discounts ... | 0 0 1 * * | | reminder_shop_car | a reminder ... | */10 * * * * | | | | | 您还可以添加一列来控制具有开始和结束日期的 cron 的期限有效性。

campaign_executions

| execution_date | execution_status | execution_log | |---------------------|------------------|---------------| | 10-10-2020 01:00:00 | finished | ... | | 10-10-2020 14:30:00 | error | ... | | 10-10-2020 14:35:00 | executing | ... |

应用启动

当您的 nodejs 活动由于故障或计划维护而启动/重新启动时,必须是这样的流程:

  • 读取campaign_configurations表,获取有效期内的所有cron表达式。
  • 使用算法来检测今天是否必须执行您的 cron 表达式。例子:
    • 仅在 12 月(圣诞节)的 cron 不应在今天运行:6 月 3 日
    • 每 5 分钟执行一次 cron,应在接下来的 5 分钟内执行
  • 每次执行开始时都必须在campaign_executions 表中创建一个状态为:pending 的条目
  • 每次执行都可以使用node-schedule 来执行它的逻辑。
  • 如果先前的执行处于挂起状态或出错,则不应执行新的执行。根据您的内部业务逻辑。

应用运行良好

当应用程序健康时,它必须查询 campaign_configurations 表才能执行新的或修改的 cron 表达式(前面解释过的流程)

根据您的内部业务逻辑,这可能每 30 分钟一次,或多或少。

您可以使用node-schedule 来完成此任务。

【讨论】:

猜你喜欢
  • 2013-10-31
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多