如何构建作业调度器



我正在构建一个作业调度器,我被困在两种方法之间。我有两种类型的工作,一种是在特定的日期安排的,另一种是按小时运行的。对于特定的日期任务,我轮询存储任务的数据库表,并将结果发布到rabbitmq消息代理,由特定的工作人员处理它们。这对于更明确的任务,比如发送提醒通知或电子邮件,效果很好。对于小时作业,我运行了一个基于cron表达式的作业,并将逻辑直接放在函数中,因此它不会进入队列。通常,这些任务是清理数据库或根据前一天的活动设置某些值等。

我想知道构建这个的最好方法是什么。让所有这些较小的作业作为微服务在一个节奏上运行,并在一个队列上监听,这样做有意义吗?我应该将所有这些组合到一个服务中吗?我应该将这两种类型的所有逻辑合并到一个大型worker应用程序中吗?

在我看来,正如所描述的,你有两个不同的系统在做两种不同的事情,这是一个问题。

例如,考虑发送一封电子邮件。根据你现在的设计,你必须编写两次电子邮件代码——一次用于发送到队列的消息,一次用于从cron发送的消息。

理想情况下,您希望在设计中尽可能容易地支持该系统。例如,如果你的设计使用队列,那么所有操作都应该以相同的方式工作——从队列中获取命令消息和参数并执行它们。cron作业和调度器都将消息添加到队列中。支持一个新操作只意味着编码一次,然后两个系统都可以将消息添加到队列中。

数据模型也应该如此。数据模型应该支持这两种类型的调度,但要尽可能多地共享。


上次创建这样一个系统时,我做了以下几行:

我有一个事件表——这个表有一个事件列表,这些事件是未来的特定日期和时间。

我有一个返回表——这个表有一个循环事件的列表(例如每周星期二的这个时候)

有一个进程——它会查看事件表,看看是否有需要触发的东西。如果有,它就会开火。然后,它将从事件表中删除它(将来不再如此),并记录它已运行的日志。它还会检查这是否是来自循环表的事件——如果是,它会将下一个未来事件添加到事件表中。

注意,在这个事件表如何工作的简化解释中,这种设计在这里只有两个表,但实际上在完整的数据模型中还有许多其他表。例如,我有许多表来支持不同的事件类型。(电子邮件模板的电子邮件事件等)。

最新更新