𝗣𝗼𝘀𝘁𝗴𝗿𝗲𝗦𝗤𝗟 𝗔𝗱𝘃𝗶𝘀𝗼𝗿𝘆 𝗟𝗼𝗰𝗸𝘀 𝗳𝗼𝗿 𝗗𝗶𝘀𝘁𝗿𝗶𝗯𝘂𝘁𝗲𝗱 𝗝𝗼𝗯 𝗦𝗰𝗵𝗲𝗱𝘂𝗹𝗶𝗻𝗴

Smetti di aggiungere Redis o SQS al tuo stack solo per lo scheduling dei job.

Puoi usare invece i PostgreSQL advisory locks. Questo approccio elimina la necessità di nuova infrastruttura.

Nei miei test, questa configurazione gestisce 10.000 job al minuto su una singola istanza del database. Spesso supera Redis in termini di latenza perché i tuoi worker possiedono già le connessioni al database. Eviti un ulteriore salto di rete (network hop).

Come implementarlo:

• Usa pg_try_advisory_xact_lock per l'assegnazione dei job. • Usa FOR UPDATE SKIP LOCKED per gestire la contesa delle righe. • Usa la variante transazionale per evitare perdite di lock (lock leaks).

Perché i lock transazionali sono importanti:

I lock transazionali vengono rilasciati automaticamente quando una transazione viene confermata (commit) o annullata (rollback). Ciò evita i lock orfani in caso di crash dell'applicazione. Funziona anche in modo sicuro con PgBouncer in modalità transazione.

Evita i session lock se utilizzi PgBouncer. PgBouncer riassegna le connessioni tra le transazioni. Questo interrompe i lock a livello di sessione e causa fallimenti silenziosi.

Se hai bisogno di session lock, crea un pool di connessioni separato per i tuoi worker. Non mescolare il traffico web e il traffico dei worker dei job nello stesso pool.

Scalare con le chiavi:

Gli advisory lock utilizzano un bigint o due interi. L'uso di due interi fornisce un naturale namespacing. Se trasformi (hash) chiavi testuali in un bigint, presta attenzione alle collisioni. Le collisioni rimangono basse fino a quando non raggiungi 100.000 ID di lock distinti. Oltre quella soglia, usa la forma a due interi per maggiore sicurezza.

Il compromesso (The Tradeoff):

• Gli advisory lock vincono per semplicità e bassi costi operativi. • Redis vince in termini di throughput puro e scalabilità orizzontale.

La maggior parte dei team non ha bisogno di più di 10.000 job al minuto. Se sei al di sotto di questo limite, attieniti a PostgreSQL. Mantiene la tua architettura pulita e i tuoi costi bassi.

Fonte: https://dev.to/software_mvp-factory/postgresql-advisory-locks-for-distributed-job-scheduling-15kp