在plpgsql存储过程中配合多后台worker使用pg_sleep是否为不良实践?
方案对比与建议
关于pg_sleep等待方案是否属于不良实践
这种做法不算绝对的不良实践,要结合你的实际配置判断:
- pg_sleep休眠过程中,后台worker不会消耗CPU资源,只会占用1个pg_cron的作业槽位和1个数据库连接。如果你的
cron.max_running_jobs配置(pg_cron允许的最大并发作业数)远大于5,且数据库总连接数余量充足,等待时长最长也只有1小时,完全不会造成资源浪费。 - 该方案的优势非常明显:逻辑简单无需额外维护轮询任务,前置作业完成后后续任务可以立即触发,没有轮询间隔的延迟。
- 仅有的风险点:如果前置作业异常中断永远不会标记完成,5个worker会长期占用资源,甚至可能影响次日的定时任务调度。你可以在循环中增加超时逻辑规避这个问题,示例如下:
DECLARE start_time timestamptz := now(); BEGIN WHILE some_variable != some_condition LOOP -- 超过2小时直接超时退出,避免无限等待 IF now() - start_time > INTERVAL '2 hours' THEN RAISE LOG '等待前置作业超时,任务退出'; RETURN; END IF; PERFORM pg_sleep(30); -- 不用1秒查一次,30秒查一次足够,进一步降低资源消耗 some_variable := some_value; END LOOP; -- 执行后续作业逻辑 END;
两种方案的选择建议
- 如果你的pg_cron并发数充足,优先选pg_sleep方案,实现成本低调度及时,调整休眠间隔到30秒即可,完全不会影响效率。
- 如果你的pg_cron本身运行的定时任务很多,作业槽位紧张,再选择5分钟轮询的方案。该方案不会长期占用资源,但要额外实现防重复执行的逻辑,避免前一轮任务还没跑完,后一轮轮询又重复启动作业。
内容的提问来源于stack exchange,提问作者PainIsAMaster
相关产品推荐
相关产品推荐

