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.
Anonimnost kao arhitektonska invarijanta: zašto „nećemo vas kontaktirati” nije dovoljno
Obećanja kao „nikada vas nećemo kontaktirati bez najave” u B2B platformama nisu izvršiva — provajderi ih zaobiđu van platforme. Ono što radi je tehnička invarijanta: kontakt podaci žive u odvojenoj sferi, server ih otključava tek na obostrani match. Svojstvo koda, ne TOS klauzula.
Static export umesto webshop-a: kada je radnja fizička, korpa je problem
Butik sa fizičkom radnjom ne treba webshop, već konverzioni put u radnju. Izbacili smo korpu, checkout i sync zaliha — i isporučili brži, jeftiniji, robustniji proizvod.
Schema.org LocalBusiness: potcenjen alat za regionalne SERP-ove
Mali zanatski sajt ne rangira preko backlink-ova, već preko strukturisanih podatkovnih signala. Schema.org LocalBusiness sa geo koordinatama, `areaServed` i `serviceArea` je direktan alat za lokalne pretrage — efikasniji od bilo kog meta tag-a, jer ga Google čita kao činjenicu, ne kao tvrdnju.
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.
Iza lekcija stoje stvarni Cases.
Pogledaj sisteme iz kojih su ovi insighti nastali — ili nam direktno donesi svoj problem.