Slovník pojmů

Mikroservisní architektura

Samostatné deploymenty mohou oddělit změny a škálování částí systému. Zároveň mění obyčejná volání metod na distribuovanou komunikaci s latencí, výpadky a složitější konzistencí.

Stručná definice

Hranici služby určuje schopnost systému, ne počet řádků.

Mikroservisa je samostatně nasaditelná služba, která poskytuje ucelenou schopnost a skrývá svou vnitřní implementaci za kontraktem. Její velikost se neposuzuje podle počtu tříd nebo řádků, ale podle odpovědnosti, autonomie změn a toho, zda ji tým dokáže bezpečně vlastnit od vývoje po provoz.

Mikroservisní architektura je vlastnost celého systému a organizace práce. Nestačí rozdělit jeden proces na malé moduly, spustit je v kontejnerech nebo ke každému přidat HTTP endpoint. Smysluplné hranice vycházejí z domény, změn, odpovědnosti týmu a provozních potřeb.

Jaký problém řeší

Části velkého systému se mohou měnit a provozovat různým tempem.

Přístup může pomoci, když jeden celek brzdí nezávislé týmy nebo když určité schopnosti mají výrazně odlišné nároky na nasazování, dostupnost a škálování.

  • samostatné nasazení katalogu bez vydání celého objednávkového systému
  • oddělené škálování čtení produktů a zpracování plateb
  • jasné vlastnictví služby týmem, který řeší její kód, data, deployment i incidenty
  • izolace změn a některých výpadků za podmínky, že volající umějí degradovat
  • postupná náhrada vymezené schopnosti bez jednorázového přepsání celého systému

Praktický příklad

Objednávka ve větší e-commerce platformě

Platforma může mít samostatnou službu Katalog pro produkty, Order Service pro objednávky, Payment Service pro platby a Inventory Service pro sklad. Hranice nevzniknou prostým rozdělením tabulek: Order Service vlastní pravidla objednávky, Payment Service průběh platby a Inventory Service rezervaci fyzických zásob. Každou službu spravuje tým, který zná její kontrakt i provoz.

API může synchronně ověřit údaje, které musí uživatel znát hned. Po lokálním uložení objednávky Order Service publikuje událost OrderCreated přes frontu zpráv. Inventory Service ji přijme, idempotentně vytvoří rezervaci a publikuje výsledek. Pokud sklad nestačí, systém potřebuje explicitní stav a kompenzační postup; jedna databázová transakce přes obě služby obvykle není k dispozici.

Textový diagram a jeho alternativa

Frontend
  → API gateway (volitelná)
    → Order Service ──sync API──→ Payment Service
           │
           └── OrderCreated event ──→ Inventory Service

Každá služba: vlastní kontrakt, datová hranice, deployment a monitoring

Jak funguje

Od požadavku přes lokální změny k distribuovanému výsledku

Tok je textovou alternativou diagramu. API gateway je možný vstup, nikoliv povinná podmínka mikroservisní architektury.

  1. Vstup do systému Frontend zavolá přímo veřejnou službu nebo volitelnou API gateway, která řeší routing a vybrané průřezové technické úlohy. Nemá se stát místem doménových pravidel.
  2. Lokální rozhodnutí Order Service ověří požadavek, provede vlastní pravidla a uloží změnu atomicky ve své datové hranici.
  3. Synchronní komunikace HTTP, gRPC nebo jiný request–response protokol se hodí, když je bezprostředně potřeba odpověď. Volající ale musí počítat s timeoutem, latencí a nedostupností protistrany.
  4. Asynchronní komunikace RabbitMQ nebo jiný broker může předat událost bez čekání na dokončení navazující práce. Opakované doručení, pořadí a chybové toky vyžadují vlastní návrh.
  5. Dosažení výsledného stavu Služby potvrzují lokální kroky v různých časech. Systém proto sleduje průběžný stav, opakování, kompenzace a případnou výslednou konzistenci (eventual consistency) místo předstírání jedné okamžité transakce.

Hlavní části a principy

Autonomie vzniká společně s kontraktem, daty a provozem.

Samostatný repozitář ani kontejner službu sám nevytvoří. Hranice má umožnit změnu jedné schopnosti bez koordinovaného vydání mnoha dalších částí.

Hranice služby

Domain-Driven Design může pomoci rozlišit bounded contexty a schopnosti, které se mění společně. Bounded context ale není automaticky mikroservisa; může zůstat modulem jednoho nasazovaného systému.

Kontrakt komunikace

Služba skrývá interní třídy a databázové schéma za verzovaným API nebo schématem zpráv. REST API je jeden možný styl rozhraní, nikoli definice mikroservisy.

Data a jejich vlastnictví

Služba má být autoritou pro své schéma a zápisy. Database per service je častý princip logického oddělení, ne příkaz kupovat pro každou službu vlastní fyzický databázový server; oddělená schémata či instance závisí na riziku a provozu.

Deployment a ownership

Nezávislé vydání vyžaduje kompatibilní kontrakty, automatizované ověření, rollback a odpovědnost týmu za službu v produkci. Každá služba nemusí používat jiný jazyk a technologická pestrost má vlastní cenu.

Service discovery a směrování

V dynamickém prostředí musí volající najít zdravou instanci služby. DNS, orchestrátor nebo registry mohou discovery zajistit; nejde o businessovou hranici ani povinný vlastní produkt.

Observabilita

Centralizované logy, metriky a korelační identifikátory skládají jeden uživatelský tok napříč službami. Distribuované trasování (tracing) ukazuje průchod požadavku a latenci mezi službami; bez observability se incident mění v hádání mezi procesy.

Výhody a omezení

Nezávislost části systému se platí distribuovanou složitostí.

Možné přínosy

  • nezávislé nasazení a škálování skutečně oddělených schopností
  • jasnější ownership kódu, dat, provozu a incidentů pro jednotlivé týmy
  • omezení rozsahu některých změn a výpadků při správně navržené odolnosti
  • možnost použít odlišnou technologii tam, kde pro ni existuje konkrétní důvod

Omezení a časté chyby

  • síťové volání může selhat, být pomalé nebo skončit neznámým výsledkem
  • řetězec synchronních volání zvyšuje latenci a riziko kaskádového výpadku
  • změny přes více služeb nemají jednoduchou společnou databázovou transakci
  • příliš jemné hranice vedou k mnoha drobným síťovým voláním a společným deploymentům
  • více pipeline, prostředí, tajemství, alarmů a on-call odpovědností zvyšuje provozní náklady
  • sdílená databáze nebo knihovna může skrytě svázat služby navzdory jejich samostatným názvům

Mikroservisy, monolit a ostatní přístupy

Dobře strukturovaný monolit je často vhodnější výchozí bod.

Modulární monolit má oddělené moduly a jasná interní rozhraní, ale nasazuje se jako jeden celek a může používat jednu lokální transakci. Pro menší tým, neustálenou doménu, běžné zatížení nebo systém bez samostatných provozních potřeb bývá jednodušší vyvíjet, testovat, ladit i provozovat. Hranice lze později oddělit, pokud se pro nezávislý deployment objeví prokazatelný důvod.

Docker je možná deployment technologie, ne architektonický důkaz: jeden monolit může běžet v kontejneru a jedna mikroservisa může běžet bez něj. Také malá třída či modul uvnitř procesu není mikroservisa, protože nemá vlastní síťový kontrakt a samostatný životní cyklus nasazení.

Clean Architecture řeší směr závislostí uvnitř aplikace, zatímco mikroservisní architektura rozděluje nasazovaný systém. Lze je kombinovat, ale žádný z přístupů není podmínkou druhého. SOA je širší rodina návrhů kolem služeb; mikroservisy obvykle zdůrazňují jemnější doménové hranice, autonomní týmy a nezávislé deploymenty, přesná hranice názvů však není univerzální norma.

Odolnost a provoz

Každá síťová hranice potřebuje plán pro částečné selhání.

Úspěšný provoz závisí stejně na organizaci, automatizaci a diagnostice jako na samotném rozdělení kódu.

  • definovat timeouty, omezený retry a circuit breaker podle typu operace
  • použít korelační ID, centralizované logy, metriky, alerty a tracing důležitých toků
  • navrhnout asynchronní konzumenty s idempotencí a dohledatelným stavem zpracování
  • držet lokální databázové transakce uvnitř jedné služby a přes hranice modelovat výslednou konzistenci či kompenzace
  • verzovat kontrakty kompatibilně a ověřovat interakce mezi producenty a konzumenty
  • sledovat vlastnictví služby, provozní cíle, náklady a postup obnovy po výpadku
  • vyhodnocovat, zda hranice stále snižuje koordinaci, nebo ji pouze přesunula do sítě

Časté otázky

Mikroservisy bez technologických zkratek

Jsou mikroservisy automaticky lepší než monolit?

Ne. Přinášejí smysl, když nezávislé nasazení, škálování a ownership převáží náklady distribuovaného systému. Pro menší tým a neustálenou doménu bývá dobře strukturovaný monolit bezpečnější a levnější.

Musí mít každá mikroservisa vlastní databázový server?

Nemusí. Důležitá je autorita služby nad daty a omezení přímého přístupu ostatních služeb. Fyzická instance, cluster nebo oddělené schéma se volí podle izolace, dostupnosti a provozních nákladů.

Je Docker kontejner mikroservisa?

Ne. Kontejner je způsob zabalení a spuštění procesu. Může obsahovat monolit, worker i mikroservisu; architektonickou hranici a odpovědnost neurčuje.

Musí mikroservisy komunikovat přes REST API?

Ne. Mohou používat synchronní HTTP či gRPC i asynchronní zprávy a události. Volba závisí na potřebě okamžité odpovědi, odolnosti, vazbě a požadované konzistenci.

Jak poznat příliš malé služby?

Varováním jsou mnohá drobná síťová volání, změny vyžadující společné vydání několika služeb, sdílené interní modely a nejasný vlastník. Funkce, které se mění společně, pravděpodobně patří do jedné hranice.

Jak architekturu volím v praxi

Hranice nasazení odděluji jen tam, kde řeší skutečnou potřebu systému a týmu.

Při návrhu zvažuji doménu, konzistenci dat, integrační chyby, observabilitu i provozní kapacitu. Mikroservisa není cíl sama o sobě a dobře strukturovaný monolit zůstává plnohodnotnou volbou.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.