因此,我使用 Nest.js 开发了一个系统,它能够根据前端应用程序中的用户输入创建一个 动态 cronjob,我将此数据存储在数据库中,同时在服务器中创建作业使用动态计划模块 API。今天我想知道如果我的服务器关闭或自行重新启动,我的 cronjobs 会发生什么,因为我的作业不是声明性的并且它们是在运行时创建的我认为也许当我的服务器启动时我应该再次创建 cronjobs?我不确定这是否存储在内存中或其他什么地方,因为它不在文档中。
简而言之,我关心的是:
服务器自行启动后,我是否应该使用数据库中的信息重新创建作业?为什么是或为什么不是?
服务器重新启动后,您必须重新启动 CRON 任务。
原因是您的 NestJS 应用程序并未真正将 CRON 表达式添加到计算机上的 crontab 中,而是在支持 CRON 表达式的任务运行程序中调度和运行这些任务(包示例:
node-cron
)
一旦服务器停止,调度程序(在同一进程上运行)也会停止。
您已经提到您已经将任务存储在数据库中,因此您应该能够获取在服务器 init 上重新创建任务所需的信息。
我假设您有一个
Service
来处理 CRON 任务并可以访问数据库。否则你可以创建一个专用的
您可以修改它以实现
OnModuleInit
接口并执行逻辑来读取应运行并启动它们的所有现有任务:
@Injectable()
class CronService implements OnModuleInit {
constructor(private readonly cronRepository: CronRepository) {}
/*
...
CRON IMPLEMENTATION
...
*/
private async restartSavedCronTasks(): Promise<void> {
// get data from DB and start all relevant tasks
}
async onModuleInit: Promise<void> {
await this.restartSavedCronTasks();
}
}
答案是肯定的,您应该在服务器重新启动后重新创建 cron 作业。 最好在用户创建 cron 作业后,将其存储在数据库中或使用已用于前端的数据库。
一般来说,如有必要,您可以对这些数据进行两个级别的持久化。
场景1
您很少重新启动服务器。在这种情况下,存储到 s3 存储桶(非公开)中的持久数据,例如 json 文件,或者存储到 sql 或 mongo 数据库(如果已连接)。
在服务器预热时重新创建“未处理”或相关的 cron 作业。
场景2
您经常重新启动服务器/服务。在这种情况下,也许存储到像 Redis 这样的内存数据库以及更持久的类型(以防您的 Redis 数据库崩溃并且您需要重新填充它 - 前提是该数据很重要)。
在服务器预热时重新创建“未处理”或相关的 cron 作业。
一般存储到 Redis,而不是存储在特定服务器实例的内存中,也将使您的总体架构更具可扩展性,因为不同的服务器也可以从 Redis 读取(相同的“事实来源”)
我希望这可以帮助您相应地规划您的架构:)