繁体   English   中英

Nest.js 动态 cron 作业会在重启或关机后被删除吗?

[英]Will Nest.js dynamic cron jobs be deleted after a restart or shutdown?

所以我用Nest.js开发了一个系统,它能够根据用户在前端应用程序中的输入创建一个动态 cronjob ,我将这些数据存储在我的数据库中,同时我使用动态调度模块在服务器中创建作业API 今天我想知道如果我的服务器关闭或它自己重新启动,我的 cronjobs 会发生什么,因为我的作业不是声明性的并且它们是在运行时创建的,我认为也许当我的服务器启动时我应该再次创建 cronjobs? 我不确定这是否存储在 memory 或其他东西中,因为它不在文档中。

简而言之,我的担忧是:

服务器启动后,我是否应该使用数据库中的信息重新创建作业? 为什么是或为什么不是?

服务器重新启动后,您必须重新启动 CRON 任务。

您已经提到您已经将任务存储在数据库中,因此您应该能够获得在服务器 init 上重新创建任务所需的信息。

我假设您有一个Service来处理 CRON 任务并可以访问数据库。

您可以对其进行修改以实现OnModuleInit接口并具有执行逻辑来读取所有应该运行并启动它们的现有任务:

@Injectable()
class CronService implements OnModuleInit {
  constructor(private readonly cronRepository: CronRepository) {}
  
  /*
    ...
    CRON IMPLEMENTATION
    ...
  */

  async onModuleInit: Promise<void> {
    await this.restartSavedCronTasks();
  }
}

答案是肯定的,您应该在服务器重新启动后重新创建 cron 作业。 最好在用户创建 cron 作业后,将其存储在数据库中或使用您已经用于前端的数据库。

一般来说,如果有必要,您可以对这些数据进行两个级别的持久性。

方案 1

您很少重新启动服务器。 在这种情况下,将存储到 s3 存储桶(非公共)中的 json 文件或 sql 或 mongo 数据库(如果已连接)中的持久性文件。

在服务器预热时重新创建“未处理”或相关的 cron 作业。

方案 2

您经常重新启动服务器/服务。 在这种情况下,可能存储到内存数据库,如 Redis 以及更持久的类型(以防您的 Redis 数据库下降并且您需要重新填充它 - 前提是此数据很重要)。

在服务器预热时重新创建“未处理”或相关的 cron 作业。

通常存储到 Redis 而不是在特定服务器实例上存储在内存中也可以让您的通用架构更具可扩展性,因为不同的服务器也可以从 Redis 读取(相同的“事实来源”)

我希望这可以帮助您相应地规划您的架构:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM