我有一个 MySQL 表任务。在任务中,我们可以创建一个普通任务或重复任务,它会自动在 MySQL任务表中创建一个新任务,并向用户发送一个任务已创建的电子邮件通知。经过大量研究,我发现您可以通过四种方法做到这一点
- MySQL 事件
- Kue, Bull, Agenda(node.js 调度库)
- 使用 cron 作业监控每天的任务
重复任务将在每周、每天、每月和每年重复。我们必须随时选择删除重复事件。什么是一个好的和干净的解决方案?
我有一个 MySQL 表任务。在任务中,我们可以创建一个普通任务或重复任务,它会自动在 MySQL任务表中创建一个新任务,并向用户发送一个任务已创建的电子邮件通知。经过大量研究,我发现您可以通过四种方法做到这一点
重复任务将在每周、每天、每月和每年重复。我们必须随时选择删除重复事件。什么是一个好的和干净的解决方案?
正如您已经确定的那样,有多种方法可以解决此问题,这就是我的做法,但我会做出一些假设,例如您可能拥有多少任务以及系统前进的灵活性.
如果您不太可能更改任务时间选项(每天、每周、每月、每年)。每个任务将具有以下字段last_run_date
和next_run_date
. 每次运行任务时,我都会更新这些字段并在日志表中创建一个条目,例如task_run_log
它还将存储任务运行的日期/时间。
然后我会有一个 cron 作业,它会向 nodejs 服务触发一条 HTTP 消息。该 Web 服务将查看任务表,找出当天需要执行的任务,并将每个任务的消息发送到某种队列(AWS SQS、GCP Pub/Sub、Apache Kafka 等)。队列中的每条消息都代表一个需要执行的任务,工作人员可以订阅此队列并自己处理任务。一旦工作人员处理了一项工作,它就会创建日志条目并更新last_run_date
andnext_run_date
字段。如果任务失败,它会将其添加到将该消息移动到错误队列中,并将在任务日志中记录失败的任务。
该系统将是健壮的,因为任何失败的作业都将作为失败的作业存在于您的数据库中,并且会出现在错误队列中(您可以将其排空以删除失败的作业,或者您可以在修复工作人员时将它们重播到正常队列中)。它还可以扩展到每天必须发生的许多任务,因为您可以扩展您的工人。您也不会淹没 cron,您的 cron 作业每天只会向您的 HTTP 服务发送一个 HTTP 请求,从而启动处理。
您还可以根据 cron 作业是否运行来设置警报,以确保进程正确启动。
我不得不做一些非常相似的事情,你可以使用 npm 模块node-schedule
节点调度器有很多特性。您可以首先创建规则设置,它确定它何时运行,然后安排作业,这是确定作业执行和激活它的位置,我的代码中有一个示例,它将作业设置为每天午夜运行。
var rule = new schedule.RecurrenceRule();
rule.dayOfWeek = [0, new schedule.Range(1, 6)];
var j = schedule.scheduleJob(rule, function(){
sqlUpdate(server);
});
这可能并不完全满足您的所有要求,但您可以执行其他功能和设置。
例如,您可以使用取消功能取消任何作业
j.cancel()
您还可以设置开始时间和结束时间,如 npm 页面所示
let startTime = new Date(Date.now() + 5000);
let endTime = new Date(startTime.getTime() + 5000);
var j = schedule.scheduleJob({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function(){
console.log('Time for tea!');
});
还有其他用于安排日期和时间的选项,因为这也遵循 cron 格式。这意味着您可以设置动态时间
var j = schedule.scheduleJob('42 * * * *', function(){
console.log();
});
因此,这将允许 node.js 处理您需要的一切。您可能需要设置一个系统来跟踪计划的作业(var j),但它允许您取消它并根据您的需要安排它。
它还可以让您重新安排、检索下一个安排的事件,并且您可以有多种日期格式。
如果您需要在进程打开和打开或重置后保留作业,您需要保存作业的详细信息,这里使用 MySQL 数据库,并且在启动时,代码可以快速拉取并重新启动所有根据数据库中的数据创建的任务。当您取消作业时,您只需将其从数据库中删除。应该注意该进程需要打开才能工作,如果进程关闭,作业将不会运行