Skip to content
Kon Fartusov
← Všechny zápisky

Jak jsme nahradili spravovanou frontu dvěma sty řádky Postgresu

postgresfrontyinfrastruktura

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.