我有一个预订API,该API在数据库中创建会话,其中一列是预定的签入时间。我需要一种功能,可以根据计划的签入时间自动签入用户。我该怎么办?我能想到的唯一解决方案是每分钟运行一个基于时间的作业调度程序,该程序将检查在该分钟内调度的所有用户。有没有更好的方法可以实现这一目标?
答案 0 :(得分:0)
如果可能每分钟都有一些工作,那么计划好的工作还不错。而且即使使用e恒定的调度间隔也不大可能是一个适当的选择,因为它非常可靠,并且在准备好许多商品时(由于大致恒定的负载)通常具有更好的最坏情况行为。
但是“每分钟”的概念有些不足。首先,如果作业没有运行一次,则此刻的事件将永远丢失。而且,如果这项工作需要一分钟以上才能完成,则可能会出现类似的问题。
因此,更好的概念是,在作业运行之后,执行到目前为止尚未办理登机手续的所有项目。在发生某些事件时,这将安全地落在脚上。
但是,如果您希望基于事件的执行,即在准备好要处理某项之前没有正在运行的作业,则您必然需要某种在后台运行的 daemon 在准备好任务后安排任务。某些数据库具有内置的调度程序可以完成此任务。 Unix命令at
也可以完成这项工作。 (请注意时区问题。)
因此,假设您有一些可以在给定时间执行作业的守护程序,则需要提供该守护程序。每次数据库更新导致下一个签入时间发生变化时,您都需要调整下一个作业开始的时间。数据库触发器可用于此目的。但是您需要在此处了解竞争条件,因为并发更新可能会并行触发。您还需要注意由于意外的系统故障或任何原因而导致的启动失败。即需要某种监视。
为避免上述复杂性,我不建议为每个项目启动新作业,因为这可能会导致过多的资源使用。而且,它需要更多的监视。
除非有充分的理由不这样做,否则检查工作的周期性计划作业 是一种简单可靠的解决方案。
仅在有功耗问题和/或调度间隔需要很小的情况下,建议使用仅在有待处理的事物时才进行调度的更复杂方法。非常准确地达到计划时间。例如。 OS内核使用这种技术来避免不必要的CPU唤醒,但是在这里我们谈论的是毫秒级范围内的精度。