Lekcije iz produkcije.
Terenske beleške iz pravih sistema — debug priče, arhitektonski kompromisi, anti-patterni koje smo platili kroz ispade. Bez tutorijala, bez hot take-ova. Samo ono što je držalo u 3 ujutru.
Simptom ≠ Uzrok: Kako je auto-healer postao pravi problem
PostgreSQL primary na 91 % CPU. Auto-healer ubija najglasniji query. Sat kasnije: opet 91 %. Lekcija: brza rešenja mogu se zaključati u petlju ako niko ne pita koji se obrazac ponavlja.
Keš bez lock-a je thundering herd: 14 endpoint-a, 8 worker-a, jedna mrtva baza
Istek keša je jedini trenutak kada paralelni worker-i istovremeno postaju skupi. Ko nema lock po ključu, pri svakom isteku šalje kompletnu load na najsporiji put.
Expression index ignorisan: Zašto COALESCE u indeksu nije išao uz ORDER BY — 29 500× speedup
Funkcionalni indeks na COALESCE(column, 0) nije imao nikakav efekat. Planner ga nije koristio jer je ORDER BY imao minimalno drugačiju ekspresiju. Lekcija: ekspresioni identitet nije preporuka, to je uslov.
UPDATE sa subquery i LIMIT: Kada daemon samo mlati vazduh
Jednostavan UPDATE obrazac koji izgleda ispravno na malim količinama i u produkciji tiho stagnira. Uzrok: filter na pogrešnom mestu ubija napredak.
Commit pre async I/O: kako je jedan enricher držao ceo PgBouncer pool u idle-u
Transakcija koja čeka HTTP odgovor nevidljiva je u connection pool-u — ali drži slot. Sa dvanaest paralelnih demona dovoljno je da ceo backend padne na 502.
Finalizacija na nivou kontejnera: zašto je monitor 83 minuta pokazivao ništa
Pipeline sa N paralelnih pod-poslova finalizuje status na nivou batch-a — svi worker-i rade, ali monitor javlja mirovanje dok poslednji kontejner ne završi. Popravka: finalizacija po kontejneru, ne po batch-u.