文章导航
一、什么是 pg_cron?
pg_cron
是 PostgreSQL 的一个扩展插件,用于调度和管理定时任务。它基于经典的 cron 风格语法,允许你在数据库内部直接运行 SQL 查询,从而简化了任务调度和自动化管理的工作。
通过使用 pg_cron
,不仅可以轻松实现定时备份、清理无用数据、自动更新统计信息等操作,还可以作为通用的定时触发器,执行外部任务或脚本。
二、什么是 pg_notify?
pg_notify
是 PostgreSQL 的通知功能,通过 LISTEN/NOTIFY 机制,允许客户端之间进行异步消息传递。在定时任务管理中,pg_notify
可与 pg_cron
配合使用,完成更复杂的定时任务触发和通知功能。
三、适用场景
在处理非标准化的定制需求时,我们通常选择低代码平台,并通过脚本实现。这种方式既减少了对原有系统的侵入,又能快速完成需求交付。然而,当这些脚本需要定期执行时,例如为用户生成 T+1 的报表,就需要一套高效的定时任务触发机制。
PostgreSQL 的定时任务解决方案通过 pg_cron
和 pg_notify
的组合,可以完美满足上述需求。与 Kubernetes CronJob 相比,该方案摒弃了繁琐的 YAML 文件声明,提供了更轻量化的任务管理能力。
四、PostgreSQL 定时任务实现
1. 使用 API 创建定时任务
用户通过 Admin API 创建定时任务。API 将任务信息存储到 PostgreSQL,并通过 pg_cron
调度任务。
SELECT cron.schedule('task_id', '0 0 * * *', $$
INSERT INTO scheduled_tasks (task_id, script) VALUES ('task_id', 'EXECUTE SCRIPT');
$$);
2. 定时器触发任务
当任务达到设定时间时,PostgreSQL 会通过 pg_notify
发送通知。监听该通知的 worker 接收后,从数据库中获取任务详情。
NOTIFY task_channel, 'Task ready: task_id';
3. worker 执行任务
worker 收到通知后,从任务表中查询需要执行的脚本:
SELECT script FROM scheduled_tasks WHERE task_id = 'task_id';
然后动态执行查询到的脚本:
bash execute_script.sh
五、实现流程构图
1.流程说明
- 用户通过 Admin API 提交定时任务。
- PostgreSQL 使用
pg_cron
保存任务信息,并在触发时通过pg_notify
通知 worker。 - worker 根据通知查询任务详情,并执行相应脚本。
2.结论
相比 Kubernetes CronJob,PostgreSQL 结合 pg_cron
和 pg_notify
实现定时任务,具备以下优势:
- 配置简单:无需复杂的 YAML 配置。
- 性能稳定:基于 PostgreSQL 的高性能数据库引擎。
- 灵活性强:支持动态任务管理和脚本执行。
通过本文的介绍,你可以实现一种轻量化、高效的定时任务管理方案,为你的业务需求提供更优的支持。
免费试用 更多热门智能应用