编写背景工作进程:在数据库内核中运行定时任务
摆脱外部cron或pg_cron扩展,用PostgreSQL背景工作进程(Background Worker)API编写一个直接运行在数据库进程中的定时任务,实现毫秒级精度和事务内调度。 · 难度:入门 · +10XP
编写背景工作进程:在数据库内核中运行定时任务
PostgreSQL允许通过shared_preload_libraries加载自定义背景工作进程。本教程将使用C语言(或pgrx框架)创建一个简单的调度器:注册一个bgworker,在指定时间间隔内执行任意SQL(如清理旧数据、刷新物化视图)。区别于pg_cron(基于外部守护进程),背景工作进程共享PostgreSQL内存上下文,可以访问共享哈希表,实现低延迟。教程覆盖注册流程、信号处理(SIGTERM优雅退出)、动态库编译以及通过GUC参数配置调度间隔。
-- 背景工作进程注册代码片段(伪代码)
void _PG_init(void) {
BackgroundWorker worker;
memset(&worker, 0, sizeof(worker));
worker.bgw_flags = BGWORKER_SHMEM_ACCESS;
worker.bgw_start_time = BgWorkerStart_ConsistentState;
worker.bgw_main = my_scheduler_main;
worker.bgw_restart_time = BGW_NEVER_RESTART;
RegisterBackgroundWorker(&worker);
}
-- 看到背景进程
SELECT * FROM pg_stat_activity WHERE backend_type = 'my_scheduler';