首页 > 解决方案 > 在 plpgsql 过程/函数中使用“pg_sleep”同时使用多个工作后台进程是不好的做法吗?

问题描述

我在我的 Postgres 数据库中运行多个后台工作进程。我正在使用Pg_Cron扩展来执行此操作。正如另一个用户在这里所建议的那样,我不能不幸地使用 Pg_Timetables。

因此,我有 5 个依赖的“作业”,需要 1 个其他独立的过程/函数来执行和完成,然后才能开始。我最初让我的 Cron 作业每隔 30 分钟左右检查一次我创建的一些“job_log”表以查看独立作业是否完成(即,如果,则执行程序,如果不是,则退出程序并在下一个 Cron 间隔检查)

但是,我相信如果我一次使用并启动所有作业因此不再每 30 分钟检查一次) ,我可以大大简化我触发/编排所有这些作业/程序的方式 我会在夜间同时运行这些作业,所以我相信它不会对我的实际流量产生太大影响。pg_sleep

IE

WHILE some_variable != some_condition LOOP
   PERFORM pg_sleep(1);
   some_variable := some_value; -- update variable here
END LOOP;

我的问题是

  1. 将一次启动所有这些作业(即在 Cron 表达式中设置一个具体时间,例如 15 18 * * *),并且使用pg_sleep不好的做法/效率低下,因为我会在 1 个作业完成时空闲 5 个后台工作人员。这些所依赖的 1 项工作可能需要任何时间才能完成,即 15 分钟、30 分钟、1 小时(尽管应该小于 1 小时)。

或者,如果主要/独立作业已完成,最好仅使用 Cron 表达式每隔 5 分钟左右检查一次,以便我的其他依赖作业可以运行?

标签: postgresqlstored-proceduresplpgsqlpg-cron

解决方案


运行两个调度程序,其中一个是自制的,似乎比只运行一个执行 2(或 6、1+5,但是你数)不同事情的调度程序更复杂。如果你的目标是让事情变得更简单,你的提议真的能实现吗?

我不会担心 5 个后端同时在 pg_sleep 上睡觉。但是您可能会担心他们这样做时会阻碍 xid 地平线,这会降低吸尘和热修剪的效果。但是,如果您在一个快照中已经有一个长期运行的任务(他们正在等待的事情),那么更多的任务不会让事情变得更糟。


推荐阅读