我有一个MySQL表tasks。在任务中,我们可以创建一个正常任务或一个循环任务,该任务将自动在MySQL tasks 表中创建一个新任务,并向用户发送已创建任务的电子邮件通知。经过大量的研究,我发现你可以用四种方法
重复的任务将在每周,每日,每月和年度上重复。我们必须选择在任何时候删除重复发生的事件。什么是好的、干净的解决方案?
发布于 2019-02-12 11:57:46
正如你所发现的,有很多方法可以解决这个问题,这是我会怎么做的,但是我做了一些假设,比如你可能有多少项任务,以及系统的灵活性如何。
如果你不太可能改变任务的时间选项(每天,每周,每月,每年)。每个任务都有以下字段:last_run_date和next_run_date。每次任务运行时,我都会更新这些字段,并在日志表(如task_run_log )中创建一个条目,该日志表还将存储运行任务的日期/时间。
然后,我将有一个cron作业,它向nodejs服务发送HTTP消息。该web服务将查看任务表,查找当天需要执行的任务,并将每个任务的消息发送到某种队列(AWS SQS、GCP Pub/Sub、Apache等)。队列中的每个消息都表示需要执行的单个任务,工作人员可以订阅该队列并自行处理该任务。一旦工作人员处理了作业,它就会生成日志条目,并更新last_run_date和next_run_date字段。如果任务失败,它将将其添加到将该消息移动到错误队列中,并将失败的任务记录在任务日志中。
此系统将是健壮的,因为任何失败的作业都将以失败作业的形式存在于数据库中,并且会出现在错误队列中(您可以将该队列解压以删除失败的作业,也可以在修复员工时将其重放到正常队列中)。它还会扩展到每天都要发生的许多任务,因为你可以扩大员工的规模。您也不会淹没cron,您的cron作业将每天只向您的HTTP服务发送一个HTTP请求,该服务将启动处理。
还可以根据cron作业是否运行来设置警报,以确保进程被正确启动。
发布于 2019-02-18 03:17:02
我不得不做一些非常类似的事情,您可以使用npm模块节点调度。
节点调度器具有许多特性。您可以首先创建规则设置,该设置确定它何时运行,然后安排作业,在那里确定作业执行情况并激活它,下面是我的代码中的一个示例,该代码将作业设置为每天午夜运行。
var rule = new schedule.RecurrenceRule();
rule.dayOfWeek = [0, new schedule.Range(1, 6)];
var j = schedule.scheduleJob(rule, function(){
sqlUpdate(server);
});这可能并不完全适合您的所有需求,但还有其他功能和设置可以完成。
例如,可以使用cancel函数取消任何作业。
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数据库在这里是有意义的,并且在启动时,代码可以根据数据库中的数据快速拉动和重新启动所有创建的任务。当你取消一个任务时,你只需从数据库中删除它。应该注意的是,流程需要打开才能工作,如果进程被关闭,作业将不会运行。
https://stackoverflow.com/questions/54605232
复制相似问题