如何处理使用 nodejs 查询和更新 SQL 数据库中的 Table 的 CronJob?

How to handle a CronJob that queries and updates a Table in SQL Database using nodejs?

我需要 运行 一个 CronJob,它以 CronJob 配置中提到的特定时间间隔执行三个相互依赖的异步任务。

异步任务 1:查询 Table 以获取特定条件的结果

异步任务 2:对任务 1 中获取的结果执行异步操作

异步任务 3:使用在任务 2 中执行的操作更新 Table 对应 ID 的条目。

我无法弄清楚,如果下一个 CronJob 的下一个间隔在第一个间隔的任务结束之前开始,会发生什么。 以及如何管理它。

更具体的问题:有没有一种方法可以让我在 sql table 和正在执行的任务之间保持同步,这样如果一个 UPDATE TASK 在一个周期内待处理,它不会在下一个周期执行相同的任务。

我正在使用 node-cron npm 模块来开发 CronJob。

很遗憾,cron 不支持作业之间的依赖关系,因此您必须自己处理。您基本上有两个选择:

  • 将任务合并为一个任务
  • 在某个地方有一个标志,让 Task-n 知道 Task-n-1 是否已成功完成

如果您能够合并任务,您的生活将会简单得多,因为您可以使用您在 JavaScript 中习惯使用的工具。如果没有,您可以这样做:

  • 异步任务 1 查询数据库并将结果保存到已知位置(例如 2018-08-31-task-1-results.csv
  • Async Task-2 检查 2018-08-31-task-1-results.csv 是否存在。如果是,它就知道之前的任务是成功的,并且可以处理该文件并将输出保存到另一个文件(例如 2018-08-31-task-2-results.csv
  • 异步任务 3 的处理方式与异步任务 2 类似。

换句话说,这些任务并不直接相互依赖,而是依赖于先前任务生成的输出。这允许您重新运行 任务并记录它们的输出。我的例子是使用文件,但它可以是所有任务都可以访问的任何东西,比如中间 table.

将来,如果您不得不手写这些依赖链,我建议您考虑使用众多任务管道框架之一,例如 Luigi and Airflow