صف کارِ همروند: FOR UPDATE SKIP LOCKED
هر worker با پریدن از رو ردیفهایی که بقیه قفل کردن، یه دسته job رزرو میکنه: یه صف کاریِ قابلاتکا تو SQLِ خالص، بدون هیچ brokerِ بیرونی.
کاربرد
workerهای موازی که جدول وظایف رو مصرف میکنن، بدون اینکه همدیگه رو بلوکه کنن.
پیشنیازها
PostgreSQL 9.5+, MySQL 8+, Oracle
SQL
WITH next_jobs AS (
SELECT id
FROM job_queue
WHERE status = 'pending'
ORDER BY priority DESC, created_at
LIMIT 10
FOR UPDATE SKIP LOCKED -- ignore les lignes prises par d'autres
)
UPDATE job_queue q
SET status = 'processing',
locked_by = pg_backend_pid(),
locked_at = NOW()
FROM next_jobs n
WHERE q.id = n.id
RETURNING q.id, q.payload;نتیجه
id | payload
-------+-------------------------------------
18203 | {"type": "email", "to": "client A"}
18204 | {"type": "invoice", "order": 9102}
18207 | {"type": "email", "to": "client B"}
(3 rows)
UPDATE 3 -- 18205 et 18206 sautés : déjà verrouillés par un autre workerSQLSKIP LOCKEDJob queueConcurrence