feat(worker): add durable background jobs

This commit is contained in:
2026-06-05 15:38:03 +08:00
parent 52b6497d3a
commit 2cb02c8a91
8 changed files with 732 additions and 24 deletions
@@ -0,0 +1,7 @@
DROP INDEX IF EXISTS idx_background_jobs_idempotency_key_unique;
DROP INDEX IF EXISTS idx_background_jobs_idempotency_key;
DROP INDEX IF EXISTS idx_background_jobs_locked_at;
DROP INDEX IF EXISTS idx_background_jobs_job_type;
DROP INDEX IF EXISTS idx_background_jobs_ready;
DROP TABLE IF EXISTS background_jobs;
@@ -0,0 +1,29 @@
CREATE TABLE IF NOT EXISTS background_jobs (
id BIGSERIAL PRIMARY KEY,
queue VARCHAR(100) NOT NULL DEFAULT 'default',
job_type VARCHAR(150) NOT NULL,
payload JSONB NOT NULL DEFAULT '{}',
status VARCHAR(50) NOT NULL DEFAULT 'queued',
priority INTEGER NOT NULL DEFAULT 0,
attempts INTEGER NOT NULL DEFAULT 0,
max_attempts INTEGER NOT NULL DEFAULT 3,
scheduled_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
locked_at TIMESTAMP WITH TIME ZONE,
locked_by VARCHAR(150),
idempotency_key VARCHAR(255),
last_error TEXT,
finished_at TIMESTAMP WITH TIME ZONE,
failed_at TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_background_jobs_ready
ON background_jobs(status, queue, scheduled_at, priority DESC, id);
CREATE INDEX IF NOT EXISTS idx_background_jobs_job_type ON background_jobs(job_type);
CREATE INDEX IF NOT EXISTS idx_background_jobs_locked_at ON background_jobs(locked_at);
CREATE INDEX IF NOT EXISTS idx_background_jobs_idempotency_key ON background_jobs(idempotency_key);
CREATE UNIQUE INDEX IF NOT EXISTS idx_background_jobs_idempotency_key_unique
ON background_jobs(idempotency_key)
WHERE idempotency_key IS NOT NULL AND idempotency_key <> '';