𝗣𝗼𝘀𝘁𝗴𝗿𝗲𝗦𝗤𝗟 𝗔𝗱𝘃𝗶𝘀𝗼𝗿𝘆 𝗟𝗼𝗰𝗸𝘀 𝘃𝗼𝗼𝗿 𝗗𝗶𝘀𝘁𝗿𝗶𝗯𝘂𝘁𝗲𝗱 𝗝𝗼𝗯 𝗦𝗰𝗵𝗲𝗱𝘂𝗹𝗶𝗻𝗴
Stop met het toevoegen van Redis of SQS aan je stack, puur voor job scheduling.
Je kunt in plaats daarvan PostgreSQL advisory locks gebruiken. Deze aanpak neemt de noodzaak voor nieuwe infrastructuur weg.
In mijn tests verwerkt deze setup 10.000 jobs per minuut op een enkele database-instantie. Het verslaat Redis vaak op het gebied van latency, omdat je workers al databaseverbindingen open hebben staan. Je voorkomt een extra network hop.
Hoe je dit implementeert:
• Gebruik pg_try_advisory_xact_lock voor het claimen van jobs.
• Gebruik FOR UPDATE SKIP LOCKED om row contention te verwerken.
• Gebruik de transactionele variant om lock leaks te voorkomen.
Waarom transactionele locks belangrijk zijn:
Transactionele locks worden automatisch vrijgegeven wanneer een transactie wordt gecommit of wordt teruggedraaid. Dit voorkomt orphaned locks als je applicatie crasht. Het werkt ook veilig met PgBouncer in transaction mode.
Vermijd session locks als je PgBouncer gebruikt. PgBouncer wijst verbindingen opnieuw toe tussen transacties door. Dit verbreekt locks op sessieniveau en veroorzaakt stille fouten.
Als je session locks nodig hebt, maak dan een aparte connection pool aan voor je workers. Meng webverkeer en verkeer van job workers niet in dezelfde pool.
Schalen met keys:
Advisory locks gebruiken een bigint of twee integers. Het gebruik van twee integers zorgt voor natuurlijke namespacing. Als je tekstuele keys hasht naar een bigint, let dan op collisions. Het aantal collisions blijft laag tot je de 100.000 unieke lock ID's bereikt. Gebruik daarna de vorm met twee integers om veilig te blijven.
De afweging:
• Advisory locks winnen op eenvoud en lage operationele kosten. • Redis wint op pure throughput en horizontale schaalbaarheid.
De meeste teams hebben geen meer dan 10.000 jobs per minuut nodig. Als je onder die limiet zit, houd het dan bij PostgreSQL. Het houdt je architectuur schoon en je kosten laag.
Bron: https://dev.to/software_mvp-factory/postgresql-advisory-locks-for-distributed-job-scheduling-15kp