Jedna z nejcennějších dovedností zkušeného backend engineera není psát kód, ale vybrat správný nástroj a umět obhájit proč a stejně tak odmítnout nástroj, který je sice populární, ale na tenhle problém se nehodí. Většina architektonických katastrof totiž nevzniká špatně napsaným kódem, ale špatně zvolenou technologií. Tahle kapitola tě naučí o volbách přemýšlet.
Pár pojmů na úvod
- Provozní náklad = kolik práce dá technologii dlouhodobě provozovat: naučit se ji, monitorovat, aktualizovat, opravovat, najít na ni lidi. Nová technologie nikdy není „zadarmo".
- Throughput (průtok) = kolik toho nástroj zvládne za jednotku času (např. zpráv za sekundu).
- Lock-in = uvíznutí u dodavatele nebo technologie, ze které se pak těžko přechází jinam.
- Škála (scale) = jak velký provoz/objem dat musíš zvládnout.
Zlaté pravidlo: nudná technologie vyhrává
Choose Boring Technology („vybírej nudné technologie"). Každá nová technologie má skrytý provozní náklad. Máš jen omezený „rozpočet na inovaci", utrať ho tam, kde je to tvoje konkurenční výhoda, ne na infrastruktuře, kterou má vyřešenou kdekdo.
- Postgres + jeden monolit + jeden server uvezou překvapivě velký provoz. Většina firem Kafku, Kubernetes ani microservices nepotřebuje, nasadí je z módy a zaplatí to složitostí.
- YAGNI (You Aren't Gonna Need It, „nebudeš to potřebovat"), neřeš škálu, kterou nemáš. Předčasná složitá architektura tě zabije dřív než úspěch.
Anti-patterny výběru (poznej je i u sebe)
- 🚩 Resume-driven development, vybírám podle toho, co chci mít v životopise, ne podle toho, co řeší problém.
- 🚩 Hype-driven, „všichni dělají microservices/Kafku/Mongo, tak my taky".
- 🚩 Big-tech cargo cult, „Netflix to dělá takhle". Jenže ty nejsi Netflix a nemáš jeho škálu ani stovky lidí na provoz.
- 🚩 Golden hammer („zlaté kladivo"), umím jeden nástroj, tak ho cpu na všechno.
- 🚩 Shiny new thing, nezralá novinka bez komunity = ty jsi její testovací oddělení.
Rozhodovací postup (projdi ho pokaždé)
Než nasadíš jakoukoli technologii, zodpověz si:
- Jaký konkrétní problém řeší? Pojmenuj ho. Když to nedokážeš, nástroj nepotřebuješ.
- Co je nejjednodušší věc, která by fungovala? Začni od ní (soubor? tabulka v Postgresu? cron?).
- Mám ten problém opravdu teď? Nebo „možná za dva roky při 100× provozu"? → YAGNI.
- Jaký je provozní náklad? Kdo to bude provozovat, hlídat a opravovat ve 3 ráno?
- Je to zralé a má to komunitu? Stabilní verze? Dokumentace? Najdu na to lidi a odpovědi?
- Jak se to spojí s tím, co už mám? Každá další databáze = další záloha a další věc, co se rozbije.
- Jak z toho ven? Jak těžké bude to za dva roky vyměnit (lock-in)?
Dobrá obhajoba zní: „Mám problém X, nejjednodušší řešení je A, ale naráží na konkrétní limit L, proto sahám po B a beru na sebe náklad N." Špatná zní: „B je moderní / rychlé / cool."
Konkrétní volby
Jazyk / runtime
Nejde o „nejrychlejší", ale o vhodnost + ekosystém + tým.
- Node / TypeScript: skvělý na I/O práci (API, realtime), sdílí jazyk s frontendem, obří ekosystém knihoven.
- Go: jednoduchost a výkon, ideální na síťové služby a infra nástroje; snadné nasazení (jedna binárka).
- Python: data, ML, skripty, rychlý vývoj; pomalejší běh.
- Java / C#: velký enterprise, zralé a výkonné, ale upovídané.
- Rust: maximální výkon a bezpečnost paměti tam, kde záleží na každé mikrosekundě; pomalejší vývoj.
Rozhoduj: Je problém spíš o čekání (I/O), nebo o počítání (CPU)? Co umí tým? Jaké knihovny potřebuju?
Pozn.: porovnání konkrétních možností (databáze, broker, API styl, architektura, hosting) najdeš v tabulkách níže, tady je jen princip, jak se rozhodnout. Záměrně to neopakuju dvakrát.
SQL vs NoSQL a KTERÁ
Výchozí volba = Postgres (zvládne relace, JSON, fulltext… jeden nástroj na 90 % potřeb). Po jiné databázi sáhni jen s konkrétním limitem, který Postgres neuveze. Pravidlo: jedna databáze, dokud tě limit nedonutí přidat druhou, každá další je další záloha, monitoring a věc, co se může rozejít.
Message broker. Kafka vs RabbitMQ vs nic
Nejdřív se zeptej: potřebuju vůbec broker? Na pár asynchronních úloh stačí tabulka v Postgresu jako fronta nebo Redis; broker přidej, až to přeroste. 🚩 „Nasadíme Kafku" bez odpovědi na jaký průtok a proč ne tabulka v Postgresu = červená vlajka.
Monolit vs Microservices ⭐ (nejdražší rozhodnutí)
Začni monolitem. Skoro vždy, jednodušší vývoj, nasazení, debug i transakce, žádná síťová režie. Microservices řeší organizační, ne technický problém (víc týmů, co se nechtějí blokovat; části s různými nároky na škálu) a platíš za ně daň: distribuované transakce (saga!), výpadky sítě, eventual consistency, složitější provoz. Cesta: dobře rozčleněný monolit → vyřízni z něj službu, teprve až to reálně bolí.
Hosting / cloud
Začni jednoduše, jeden server nebo PaaS (Railway, Render, Fly, Coolify); vydrží to déle, než čekáš. Kubernetes ber, až máš mnoho služeb a tým, který ho uveze (pro malý projekt provozní peklo). Serverless na nepravidelný provoz (pozor na cold start a lock-in). A managed vs vlastní provoz: managed stojí víc peněz, ale šetří tvůj čas a noční pohotovosti.
📊 Rozhodovací tabulky (kus po kuse)
Rychlá reference. Sloupec „Sáhni po tom, když" je důležitější než výčet vlastností, rozhoduj se podle problému, ne podle počtu ✅.
Databáze, kterou jako hlavní
| Postgres | MySQL | MongoDB | Redis | Cassandra/Dynamo | Elasticsearch | |
|---|---|---|---|---|---|---|
| Model | Relační + JSON | Relační | Dokumentový | Klíč-hodnota | Wide-column | Vyhledávací index |
| Transakce | ✅ silné ACID | ✅ ACID | ⚠️ omezené | ⚠️ základní | ❌ (eventual) | ❌ |
| JOINy | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Škála zápisu | Silnější stroj + sharding | Silnější stroj | Horizontální | Silnější stroj | Horizontální ⭐ | Horizontální |
| Latence | ms | ms | ms | zlomky ms ⭐ | ms | ms |
| Sáhni po tom, když | Default na 90 % | Máte už MySQL | Hodně proměnlivé schéma, žádné JOINy | Cache, rate limit, fronty | Obří objem zápisů, OK s eventual | Fulltext, logy |
Výchozí volba = Postgres. Ostatní přidávej až s konkrétním limitem, který Postgres neuveze.
Message broker
| Postgres/Redis fronta | RabbitMQ | Kafka | SQS (cloud) | |
|---|---|---|---|---|
| Jak na to myslet | Tabulka úkolů | Chytrá fronta | Trvalý záznam | Spravovaná fronta |
| Průtok | Nízký–střední | Střední–vysoký | Velmi vysoký ⭐ | Vysoký |
| Přehrávání historie | ❌ | ❌ | ✅ ⭐ | ❌ |
| Víc nezávislých konzumentů | ❌ | ⚠️ | ✅ ⭐ | ⚠️ |
| Provozní náklad | ~nula ⭐ | Střední | Vysoký | Nula (managed) |
| Sáhni po tom, když | Pár úloh, malý objem | Úkoly, složité routování | Streaming, přehrávání, velký objem | Jsi v cloudu, nechceš nic provozovat |
🚩 Kafka má smysl od vysokého průtoku / potřeby přehrávání / mnoha konzumentů. Na pár zpráv denně = tabulka v Postgresu.
API styl
| REST | gRPC | GraphQL | |
|---|---|---|---|
| Výkon | Dobrý | Nejlepší ⭐ | Dobrý |
| Typovost | ⚠️ | ✅ ⭐ | ✅ |
| Z prohlížeče napřímo | ✅ | ⚠️ jen přes gRPC-Web/proxy | ✅ |
| Cachování | ✅ snadné ⭐ | ❌ těžké | ❌ těžké |
| Složitost serveru | Nízká | Střední | Vysoká |
| Sáhni po tom, když | Default, veřejné API | Mezi vlastními službami, nízká latence | Mobil / proměnlivé potřeby klienta |
Architektura
| Monolit | Modular monolith | Microservices | |
|---|---|---|---|
| Vývoj/debug | Snadné ⭐ | Snadné | Těžké (distribuované) |
| Transakce | ✅ lokální ⭐ | ✅ lokální | ❌ saga, eventual |
| Nezávislé škálování/deploye | ❌ | ⚠️ | ✅ ⭐ |
| Provozní/síťová režie | Nízká ⭐ | Nízká | Vysoká |
| Sáhni po tom, když | Skoro vždy na startu | Roste, chceš hranice modulů | Víc týmů se blokuje, různé nároky na škálu |
Cesta zleva doprava, až když to bolí. Ne naopak.
Hosting
| 1 server / VPS | PaaS (Railway, Render, Coolify) | Serverless | Kubernetes | |
|---|---|---|---|---|
| Setup | Ruční | Snadný ⭐ | Snadný | Složitý |
| Provozní náklad | Střední | Nízký | Nízký | Vysoký |
| Cena při malém provozu | Fixní | Nízká | ~nula ⭐ | Vysoká |
| Sáhni po tom, když | Plná kontrola | Default pro malé/střední | Nepravidelný provoz | Mnoho služeb + tým na k8s |
🌳 Rychlý rozhodovací strom
Strom je start, ne dogma. Vždy ještě projdi rozhodovací postup výše a obhaj volbu konkrétním problémem.
Jak rozhodnutí zaznamenat (ADR)
Důležitá rozhodnutí si zapiš do krátkého dokumentu: kontext → zvažované možnosti → rozhodnutí →
důsledky. Tomu se říká ADR (Architecture Decision Record). Za rok si nebudeš pamatovat proč, a
nováček to nepřekope naslepo. Jeden .md soubor stačí:
# ADR-001: Postgres jako hlavní databáze
Kontext: Potřebujeme relační data + občas JSON, malý provoz.
Možnosti: Postgres / MongoDB / MySQL.
Rozhodnutí: Postgres: relace i JSON pokryje obojí a tým ho zná.
Důsledky: Při extrémním objemu zápisů budeme později řešit repliky/sharding.
Failure modes, nejčastější chyby ve výběru
- Over-engineering: Kafka/Kubernetes/microservices na projekt, co uveze jeden Postgres. Nejčastější.
- Zbytečně moc databází: pět úložišť, pětkrát víc provozní zátěže, nikdo neví, kde co je.
- Hype lock-in: vsadíš na nezralou technologii, komunita vymře a držíš ji sám.
- Under-engineering: opačný extrém: ignoruješ známý limit, který přijde za měsíc.
🛠️ Cvičení
- Obhaj, nebo zamítni. Junior navrhuje Kafku na appku se 100 zprávami denně. Napiš protiargument a co bys použil místo toho.
- Vyber databázi. Pro tři případy, relační data s občasným JSON, bleskově rychlá cache, fulltext nad logy, vyber úložiště a zdůvodni, proč ne (nebo proč ano) Postgres na všechno.
- Monolit, nebo microservices? Pro startup se čtyřmi vývojáři a jasným produktem rozhodni a vyjmenuj, co bys volbou microservices obětoval.
- Napiš ADR. Vyber reálné rozhodnutí (např. fronta: tabulka v Postgresu vs RabbitMQ) a sepiš ho: kontext → možnosti → rozhodnutí → důsledky.
- Poznej anti-pattern. U pěti výroků urči, jestli jde o resume-driven / hype-driven / golden hammer volbu, nebo o legitimní rozhodnutí.
Náčrt řešení: rozbal, až si cvičení zkusíš sám
- Obhaj, nebo zamítni, zamítni: 100 zpráv denně je zlomek QPS, na který je Kafka kanón na vrabce a navíc drahá na provoz. Použij tabulku v Postgresu jako frontu (nebo Redis). Pozor: brokera přidej, až máš konkrétní důvod, vysoký průtok, přehrávání historie nebo víc nezávislých konzumentů.
- Vyber databázi, relační data s občasným JSON → Postgres (umí obojí, default); bleskově rychlá cache → Redis (zlomky ms); fulltext nad logy → Elasticsearch. Pozor: Postgres na všechno nedáš jen proto, že je default, pro cache a fulltext naráží na konkrétní limit (latence, vyhledávací index), a to je legitimní důvod sáhnout po druhém úložišti.
- Monolit, nebo microservices, pro startup se čtyřmi vývojáři a jasným produktem zvol monolit: jednodušší vývoj, nasazení, debug i transakce. Microservices řeší organizační problém (víc týmů, co se blokují), který tu nemáš. Obětoval bys: lokální transakce (nastoupila by saga + eventual consistency), jednoduchý provoz a žádnou síťovou režii. Pozor: cesta k službám až „když to bolí", ne preventivně.
- Napiš ADR, sepiš čtyři části: kontext (jaký problém a v jakém objemu), možnosti (Postgres fronta vs RabbitMQ), rozhodnutí (např. Postgres fronta, malý objem, žádné nové úložiště) a důsledky (při růstu/složitém routování přejdeme na broker). Pozor: drž to krátké a uchovej proč, ne jen co, jeden
.mdstačí. - Poznej anti-pattern, u každého výroku rozhodni podle motivace: „chci to v životopise" = resume-driven, „všichni to dělají / dělá to Netflix" = hype-driven či cargo cult, „umím jen tohle, tak to cpu všude" = golden hammer; pojmenovaný problém + trade-off = legitimní volba. Pozor: legitimitu nedělá technologie, ale jestli za ní stojí konkrétní problém a limit.
🧠 Otázky & odpovědi
Co znamená zásada choose boring technology a proč platí?
Každá nová technologie má skrytý provozní náklad (naučit se ji, provozovat, opravovat ve 3 ráno, najít lidi, aktualizovat). Máš jen omezený rozpočet na inovaci, utrať ho tam, kde je to tvoje konkurenční výhoda, ne na infrastruktuře, kterou má vyřešenou každý. Osvědčený nudný Postgres + monolit uvezou překvapivě velký provoz; exotika se zaplatí složitostí.
Kdy NEnasadit Kafku?
Když pro ni nemáš důvod: vysoký průtok, potřebu přehrávat historii, nebo víc nezávislých konzumentů téhož proudu. Na pár zpráv denně je to kanón na vrabce a navíc náročný na provoz. Pro málo asynchronních úloh stačí tabulka v Postgresu jako fronta nebo Redis. Brokera přidej, až přerosteš jednodušší řešení.
Proč začít monolitem a kdy teprve microservices?
Monolit je jednodušší na vývoj, nasazení, debug i transakce a nemá síťovou režii, pro start skoro vždy správně. Microservices řeší hlavně organizační problém (víc týmů, které se nechtějí blokovat, různé nároky na škálu), ne technický, a platíš za ně distribuovanými transakcemi, eventual consistency a provozní složitostí. Vyřízni službu z monolitu, teprve až to reálně bolí.
Jaký je dobrý a špatný způsob, jak obhájit volbu technologie?
Dobrý: „mám problém X, nejjednodušší řešení je A, ale naráží na konkrétní limit L, proto sahám po B a beru na sebe náklad N." Špatný: „B je moderní / rychlé / cool / dělá to Netflix." Volba má vycházet z pojmenovaného problému a trade-offů, ne z módy, životopisu nebo napodobování velkých firem.
K čemu je ADR (Architecture Decision Record)?
Je to krátký zápis důležitého rozhodnutí: kontext → zvažované možnosti → rozhodnutí → důsledky. Za rok
si nebudeš pamatovat proč jste to udělali takhle, a nováček to nepřekope naslepo. Jeden .md soubor
stačí. Dělá rozhodnutí dohledatelným a brání tomu, aby se osvědčené volby měnily z neznalosti kontextu.
