FOR UPDATE SKIP LOCKED cho nhiều worker cùng lấy việc mà không tranh cùng một job: mỗi worker khóa một job, các worker khác bỏ qua job đang bị khóa và lấy job kế tiếp.
Đây là cách dựng hàng đợi job nhẹ ngay trong PostgreSQL mà không cần message broker riêng.
sql
WITH next_job AS (
SELECT id FROM jobs
WHERE status = 'pending'
ORDER BY created_at
FOR UPDATE SKIP LOCKED
LIMIT 1
)
UPDATE jobs SET status = 'running'
WHERE id IN (SELECT id FROM next_job)
RETURNING *;Nếu hàng đợi lớn, bổ sung thêm: retry, visibility timeout (job treo thì trả lại), trạng thái dead-letter và index hợp lý cho cột lọc/sắp xếp.