PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

Chapter 46. 后台工作进程

PostgreSQL 具备强大的内核可扩展性,允许在独立的系统进程中运行用户或扩展插件自定义的 C 语言逻辑代码。这些进程被称为后台工作进程(Background Workers),由主守护进程 postgres 统一负责启动、监控与生命周期管理,使其生命周期与数据库实例的运行状态紧密联动。这些后台进程能够挂载访问系统的共享内存区域,并可选择与具体数据库建立内部会话连接,支持像常规客户端连接那样串行执行事务与 SQL 查询。此外,通过链接 libpq,后台进程还可以像普通外部客户端一样与服务端进行网络交互。

Warning

运行后台工作进程具备一定的系统健壮性与安全风险,因为使用 C 语言编写的后台进程拥有直接访问系统底层物理数据与内存指针的完全特权。管理员在启用包含后台工作进程的第三方模块时应格外谨慎,仅允许运行经过严密代码审计的受信插件模块。

后台工作进程可以在主服务启动时通过将模块名称加入参数 shared_preload_libraries 进行预加载初始化。模块在其 _PG_init() 初始化入口函数中调用 RegisterBackgroundWorker(BackgroundWorker *worker) 向主进程注册静态后台工作进程。此外,在系统正常运行期间,普通业务连接进程也可以通过调用 RegisterDynamicBackgroundWorker(BackgroundWorker *worker, BackgroundWorkerHandle **handle) 动态拉起动态后台工作进程。

核心配置结构体 BackgroundWorker 的定义如下:

typedef void (*bgworker_main_type)(Datum main_arg);
typedef struct BackgroundWorker
{
    char        bgw_name[BGW_MAXLEN];
    char        bgw_type[BGW_MAXLEN];
    int         bgw_flags;
    BgWorkerStartTime bgw_start_time;
    int         bgw_restart_time;       /* 重启间隔(秒),或 BGW_NEVER_RESTART */
    char        bgw_library_name[MAXPGPATH];
    char        bgw_function_name[BGW_MAXLEN];
    Datum       bgw_main_arg;
    char        bgw_extra[BGW_EXTRALEN];
    pid_t       bgw_notify_pid;
} BackgroundWorker;

字段 bgw_name 与 bgw_type 是展示在系统运行日志与操作系统进程列表(ps 命令)中的描述性字符串。同一类型的后台工作进程应使用相同的 bgw_type,以便于在进程监控工具中统一归类。

bgw_flags 是由位掩码组合而成的能力标志位:

BGWORKER_SHMEM_ACCESS

请求挂载并访问数据库共享内存,属于必选标志位。

BGWORKER_BACKEND_DATABASE_CONNECTION

请求建立内部数据库连接以支持执行 SQL 事务与查询能力。使用该标志位时必须同时声明 BGWORKER_SHMEM_ACCESS。

bgw_start_time 指定主服务在处于何种运行阶段时启动该进程:包括主服务刚完成自身初始化的最早阶段(BgWorkerStart_PostmasterStart,该阶段尚未支持数据库连接)、热备达到强一致性状态的阶段(BgWorkerStart_ConsistentState,支持连接并执行只读查询)、以及系统完全进入常规读写状态的阶段(BgWorkerStart_RecoveryFinished)。

bgw_restart_time 指定当该工作进程发生意外崩溃退出时,主服务等待多少秒后重新将其拉起重启;若设为 BGW_NEVER_RESTART 则代表崩溃后不再自动重启。

后台工作进程在主函数开始执行时,可以通过调用 BackgroundWorkerInitializeConnection 或 BackgroundWorkerInitializeConnectionByOid 绑定连接至指定数据库与指定用户身份,随后即可通过服务器编程接口(SPI)自由执行 SQL 命令。

后台工作进程的最大并发数量受限于系统全局配置参数 max_worker_processes。官方源码树中的 src/test/modules/worker_spi 模块提供了包含完整生命周期管理的端到端标准示例。