Jak jsme nahradili spravovanou frontu dvěma sty řádky Postgresu
Každý systém úloh na pozadí začíná stejně: potřebujete, aby se práce stala později a jinde, a internet radí koupit frontu. Koupili jsme ji, dva roky s ní žili a pak ji vyndali.
Co nám spravovaná fronta doopravdy dávala
Tři věci, a důležitá byla jen jedna.
- Záruky doručení, které se dají napsat za jeden večer.
- Dashboard, který po prvním měsíci nikdo neotevřel.
- Druhý systém k provozování — s vlastními výpadky, vlastním SDK a vlastní fakturou.
Co přišlo místo toho
Jedna tabulka, jeden index a sloupec locked_until místo obnovování zámku:
SELECT * FROM job_queue
WHERE queue = $1 AND status = 'queued' AND run_at <= now()
ORDER BY run_at
FOR UPDATE SKIP LOCKED
LIMIT 1;Celý trik je FOR UPDATE SKIP LOCKED. Postgres dá každému workeru jiný řádek a nikdy jednoho nezablokuje za druhým. LISTEN/NOTIFY probudí nečinné, takže nikdo nedotazuje databázi ve smyčce.
Bezpečnou tu výměnu neudělal SQL. Udělalo ji 30 behaviorálních testů napsaných nejdřív proti staré frontě — a nová pak procházela přesně stejnými testy.
Co to stálo
Dva týdny večerů, většinu z toho testy, ne fronta. Zpátky: o dodavatele míň, o fakturu míň a systém, kde spadlá úloha je řádek, který si můžete přečíst.
Ne každá spravovaná služba si tohle zaslouží. Tahle ano — část, kterou jsme reálně používali, byla menší než klientská knihovna, kterou jsme kvůli ní importovali.