Mikroservisní architektura: principy a distribuované systémy

Mikroservisní architektura: Principy a distribuované systémy

Co je mikroservisní architektura a kdy dává smysl

Mikroservisní architektura je přístup k návrhu softwaru, který rozděluje aplikaci do sady malých, samostatně nasaditelných služeb. Každá služba je organizována kolem obchodní schopnosti, má jasně definované rozhraní (typicky události HTTP/gRPC) a odpovídá za vlastní data. Cílem je zrychlit dodávání změn, umožnit nezávislé škálování, omezit kaskádové výpadky a sladit strukturu systému se strukturou týmů (Conwayův zákon).

Mikroservisy dávají smysl, pokud máte rychle rostoucí produkt, mnoho týmů, potřebu používat různé technologie a odlišné požadavky na škálování. Naopak u menšího produktu s jedním týmem bývá pragmatičtější modulární monolit s jasně vymezenými hranicemi a možností pozdějšího rozdělení.

Doménový návrh a rozdělení systému

  • Ohraničené kontexty (DDD): slaďte hranice služeb s jazykem domény; předejdete tak příliš časté komunikaci a nejasnému rozdělení odpovědností.
  • Obchodní schopnosti: jedna služba = jedna schopnost (např. platby, katalog, doporučování), nikoli „technická vrstva“.
  • Tok hodnoty: mapujte scénáře od začátku do konce (objednávka → platba → expedice) a minimalizujte synchronní závislosti.
  • Antivzor: sdílená databáze napříč službami – vede k těsnému provázání a ztrátě autonomie.

Komunikační styly: synchronní a asynchronní

  • Synchronní (HTTP/gRPC): jednoduchá komunikace, vhodná pro dotazy (queries); vyžaduje nastavení časových limitů, opakování požadavků s exponenciálním prodlužováním prodlevy a circuit breaker.
  • Asynchronní (události, fronty, streamy): Kafka, RabbitMQ, NATS. Umožňuje volnější provázání, vyšší propustnost a přirozenou škálovatelnost. Vhodné pro integrace řízené událostmi (event-driven).
  • Transakční model: počítejte s eventual consistency, používejte idempotenci, deduplikaci a outbox pattern.

Gateway, směrování a service mesh

  • API Gateway: jedno vstupní místo pro klienty (omezení počtu požadavků, autentizace/autorizace, TLS, transformace, agregace).
  • BFF (Backend for Frontend): samostatné brány pro web a mobilní zařízení, které omezují příliš častou komunikaci a přizpůsobují formát dat.
  • Service Mesh: proxy typu sidecar (např. Envoy) pro mTLS, řízení provozu, pravidla pro opakování požadavků a časové limity, circuit breaking a observabilitu bez změn aplikačního kódu.

Data v mikroservisech: autonomie a konzistence

  • Datová autonomie: každá služba vlastní své úložiště (SQL/NoSQL/vyhledávací systém/cache); ostatní služby k němu přistupují prostřednictvím API nebo událostí.
  • Transakce napříč službami: Saga pattern (choreografie nebo orchestrace) s kompenzačními kroky.
  • Schémata a jejich vývoj: verzování kontraktů (semver), schema registry pro události (Avro/JSON Schema/Protobuf), zpětná a dopředná kompatibilita.
  • Dotazy napříč hranicemi: API composition, CQRS, materializované pohledy a read models.

Spolehlivost a odolnost

  • Časové limity a opakování požadavků: vždy je definujte; použijte exponenciální prodlužování prodlevy a náhodnou složku (jitter), vyhněte se nárazovému přetížení systému („thundering herd“).
  • Circuit Breaker: izolujte poruchy, reagujte rychlým selháním (fail-fast) a využívejte záložní řešení.
  • Bulkheads a omezení zátěže: oddělujte zdroje (fondy vláken, spojení) a upřednostňujte kritické cesty.
  • Backpressure: u streamů a front kontrolujte tempo příjmu.
  • Cache a omezení počtu požadavků: snižte latenci a zatížení; zohledněte konzistenci a invalidaci.

Bezpečnost a správa tajemství

  • Zero-Trust: ověřujte každou komunikaci, používejte mTLS mezi službami a krátkodobé certifikáty.
  • Autentizace/autorizace: OAuth 2.1/OIDC, tokeny (JWT/PASETO), jemnozrnná pravidla (OPA/ABAC/RBAC).
  • Správa tajemství: trezory (Vault), rotace klíčů; tajemství nikdy neukládejte do repozitáře.
  • Bezpečnost dodavatelského řetězce: podepisování artefaktů (SLSA, Sigstore), SBOM, skenování závislostí a kontejnerů.

Observabilita: logy, metriky, trasování

  • Metriky: RED/USE, SLI/SLO a chybové rozpočty; standardizace metrik (OpenMetrics).
  • Distribuované trasování: korelační ID (W3C Trace Context), vzorkování, vizualizace kritických cest.
  • Logy: strukturované (JSON), korelované s trasami, s ohledem na ochranu osobních údajů (PII), centralizované a s definovanou retenční politikou.
  • Upozorňování: užitečné a akční, s provozními příručkami a pohotovostní službou SRE.

Nasazení, škálování a platforma

  • Kontejnery: neměnné image, vícestupňové sestavení, minimální základní image.
  • Orchestrace: Kubernetes nebo spravovaná platforma; readiness/liveness pro kontroly stavu, horizontální automatické škálování.
  • CI/CD: vývoj založený na hlavní větvi (trunk-based), automatizované testy, postupné nasazování (progressive delivery; canary, blue-green), příznaky funkcí.
  • IaC: deklarativní infrastruktura (Terraform/Helm), pravidla definovaná jako kód (policy-as-code).

Testování v mikroservisech

  • Jednotkové a komponentové testy: rychlá zpětná vazba.
  • Testování kontraktů: řízené potřebami konzumentů (consumer-driven) (Pact); chrání před regresními chybami mezi službami.
  • Integrační a E2E testy: pouze pro klíčové scénáře, aby nebrzdily nasazování.
  • Chaos engineering: simulujte poruchy (síť, latence, výpadky) a sledujte chování systému.

Organizace a týmy

  • Team Topologies: týmy zaměřené na konkrétní obchodní proudy, platformní tým a podpůrný (enabling) tým pro osvědčené postupy a bezpečnost.
  • „You build it, you run it“: odpovědnost za službu od začátku do konce, včetně metrik kvality a nákladů.
  • Governance: pouze nezbytná pravidla (konvence API, telemetrie, bezpečnost), osvědčené postupy (golden paths) a šablony.

Antivzory a časté pasti

  • Distribuovaný monolit: mnoho služeb, ale těsně provázaných (sdílená databáze, společná vydání) – složitost bez přínosů.
  • Nanoslužby: příliš malé služby, vysoká režie spojená se sítí a koordinací.
  • Příliš častá komunikace: příliš mnoho synchronních volání v rámci jedné transakce – řešením je agregace, BFF a události.
  • Předčasné škálování: rozdělení bez jasně vymezené domény a připraveného týmu – zpomalení vývoje.

Migrace z monolitu: strategie „bez bolesti“

  • Strangler Fig: postupné obalování monolitu pomocí API/proxy a vyčleňování domén po částech.
  • Vyčleňování podle přínosu: začněte tam, kde je jasný přínos (nezávislé škálování, rychlejší změny).
  • Migrace dat: dual-write s outboxem, streamy pro doplnění historických dat (backfill), ověřování konzistence.
  • Paralelní provoz: dočasná dvojí implementace kritických endpointů a nasazení ve stínovém režimu.

Výkonnost a náklady

  • Rozpočet na latenci: počítejte se síťovými skoky; optimalizujte kritické cesty (agregace, cache, asynchronní reakce).
  • Provozní náklady: více komponent znamená více práce s observabilitou, bezpečností a platformou; zvažte návratnost.
  • Škálování podle profilu: zátěžově náročné na I/O vs. zátěžově náročné na CPU; samostatné plány pro databáze, fronty a cache.

Referenční architektura (příklad)

  • Klient (web/mobilní zařízení) → API Gateway/BFF → mikroservisy (Katalog, Košík, Platby, Doprava) → vlastní databáze (PostgreSQL, Redis, Elastic).
  • Event bus (Kafka): události OrderPlaced, PaymentCaptured, ShipmentCreated pro choreografii.
  • Service mesh: mTLS, pravidla pro opakování požadavků a časové limity, směrování canary.
  • Observabilita: metriky + trasování + logy konsolidované na jednom panelu se SLO.
  • CI/CD: pipeline s testy, testy kontraktů, skenováním, canary nasazením a automatickým návratem k předchozí verzi.

Kontrolní seznam pro úspěšné mikroservisy

  1. Hranice služeb podle obchodních schopností a ohraničených kontextů.
  2. Asynchronní integrace všude, kde je to možné; synchronní volání minimalizujte.
  3. Vlastnictví dat na úrovni služeb; žádná sdílená schémata.
  4. Standardizovaná observabilita a bezpečnost (mTLS, OAuth/OIDC, OPA).
  5. Automatizované CI/CD, postupné nasazování, IaC a pravidla definovaná jako kód.
  6. Testování kontraktů a řízený vývoj schémat/událostí.
  7. Vzory odolnosti: časové limity, opakování požadavků, circuit breaker, bulkheads, backpressure.
  8. Platformní tým a osvědčené postupy (golden paths) pro zvýšení produktivity vývojářů.
  9. Pravidelné provozní revize a SLO s chybovými rozpočty.

Závěr

Mikroservisní architektura není cílem sama o sobě, ale prostředkem, jak urychlit dodávky, omezit rizika změn a škálovat organizaci. Funguje tehdy, když hranice odpovídají doméně, data jsou autonomní, komunikace je převážně asynchronní, infrastruktura je automatizovaná a týmy nesou odpovědnost od začátku do konce. Pokud tyto principy dodržíte, získáte systém, který se přizpůsobuje potřebám podnikání – ne naopak.