使用Postgres为强大的Cron系统

2021-03-17 19:01:35

任何中型应用程序都将有需要在一定时间甚至是临时时间进行的任务。这通常,这通常将不同的基础设施组件引入应用程序,例如,在Rails中,您可以使用Sidekiq或使用Python,您可以使用芹菜,当然当然有系统级别Cron。虽然这些通常被视为作业队列,但它们也具有基于时间的调度组件。但还有其他方法可以实现基于时间的任务调度!

当然,我们可以使用上述系统Cron,但它的效用通常受到OS级别的德国。并且CRONTAB甚至无法及时表达单个实例,它们始终是重现(尽管存在可以表达此问题的扩展)。那么,是唯一一个将这些新组件介绍到您的应用程序中的选项吗?或者我们可以做一些更明智的事情吗?

是的,我们可以使用我们的数据库和应用程序服务器以几行代码为自己构建灵活且强大的Cron系统!

首先,让我们谈谈Postgres。 Postgres很棒,它实际上足以用于典型的最终用例。这不仅仅是因为我们在Postgres中实现了可扩展的事件传递机制,而且在社区中广泛验证。以下几乎是谈论作业队列的postgres的资源:https://layerci.com/blog/postergres-is-the-answer/,

除了传统RDBMSS的交易保障外,Postgres还提供了漂亮的功能,如选择跳过锁定,这使得它非常适合建立最终系统。事实上,最近推出了一个名为MessageB的新产品,它旨在通过Postgres解决整个活动和消息传递功能:https://blog.eventide-project.org/articles/announcing-message-db/。

现在我们同意Postgres非常适合最终(如果你不是,那么内容的其余内容可能仍然可以说服你......所以阅读),我们会看到我们如何通过Postgres制作Cron服务。

让我们想象一下,时间的实例是用时间戳列的行建模的。这意味着像* * * * *(每分钟运行某些东西)的Cron计划可以被建模为表格,其中每分钟具有时间戳。所以这是一个无限的桌子,但它很容易将时间戳覆盖到一些最大值(说明未来一天或一年,您可以选择)。

在我们的应用程序代码中,假设我们运行一个线程,每分钟执行以下简单的活动:

我们甚至可以运行多个线程,并使用Postgres Tricks,如SELECT for Update for Update Skip锁定的横向处理它们的水平刻度。显然,我们还需要继续为将来生成新事件:只需有另一个线程,其中包含时间戳的行,直到下一个x小时(或任何可配置值)。

现在,当你有Sidekiq或Celery或System Cron时,你会这样做吗?让我们看看Postgres上有基于事件的Cron的一些额外优势:

Postgres非常适合最终,Cron可以用事件进行精心建模!它遵循的是,Postgres很棒。我们在此模型之后构建了Hasura计划的触发器,您可以了解文档中的实现或在Hasura云上尝试。

Hasura Cloud为您提供完全管理的生产就绪GraphQL API,可以帮助您更快地构建现代应用程序。

Hasura允许您动员&通过建立强大的安全和amp,联邦联邦辅助组织的数据;灵活的GraphQL API,可以查询数据库中的数据,HTTP服务,无服务功能以及第三方API。