首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重启服务器时重新安排nodejs中的cron作业

重启服务器时重新安排nodejs中的cron作业
EN

Stack Overflow用户
提问于 2020-05-28 17:49:34
回答 1查看 5.2K关注 0票数 1

我有节点js应用程序,用户可以调度4-5个不同的cron作业。用户选择一个start_date、end_date、start_time和end_time,并相应地调度cron函数,并生成一些活动来连接引线(或其他用户)。我正在使用npm包节点调度来实现所需的cron作业执行,但是如果我的web应用程序在两者之间崩溃,问题就会出现。

根据node-schedule的官方文件,

请注意,Node调度是为进程内调度设计的,也就是说,调度作业只有在脚本运行时才会启动,执行完成后计划将消失。

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

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

假设,我的调度程序将在5月28日上午11:00至5月31日12:00之间执行调度程序启动它的工作,其中一些活动在两者之间执行。如果我的服务器在5月30日关闭,我如何从剩余的日期和活动中提取,然后从那里完成它?

那么,我关心的是如何安排或处理竞选活动的cron职务?如果在服务器停止的情况下,活动cron作业中有任何一个处于崩溃状态,那么我如何才能重新调度或执行该cron函数的时间或日期?

我对cron的工作经验不多,希望能找到一些方便的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-02 20:56:31

这里有一些建议,您可以根据硬件功能来检查或实现这些建议:

去耦

将当前应用程序分离到两个分离的工件中: web和campaign。这允许独立地部署、重建、重新部署和管理每个服务。也要有自主或跨职能的团队。

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

容错性

如果您需要一个不影响失败、崩溃或任何需要重新启动的事件的应用程序,则必须在应用程序外部使用 that

通常,这个之外是一个数据库。如果数据库不是您的选项,您可以使用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 | ... |

App启动

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

  • 读取campaign_configurations表并在有效期内获取所有cron表达式。
  • 使用算法检测您的cron表达式今天是否必须执行。示例:
    • 一个只在十二月(圣诞节)才能运行的国家不应该在今天:03年6月
    • 每5分钟一次,在接下来的5分钟内执行

  • 开始时的每一次执行都必须在campaign_executions表中创建一个状态为:挂起的条目
  • 每次执行都可以使用节点调度执行它的逻辑。
  • 如果在挂起或错误中有先前的执行,则不应执行新的执行。根据你的内部业务逻辑。

App是健康的

当应用程序正常时,它必须查询campaign_configurations表,以便执行新的或修改过的cron表达式(先前解释过的流程)。

根据您的内部业务逻辑,这可能是每隔30分钟就会发生一次。

您可以使用节点调度完成此任务。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62071254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档