Serverless computing
Serverless computing (FaaS, BaaS a managed eventové služby) umožňuje rychlé nasazení funkcí bez správy serverů. Náklady však vznikají za každé volání, dobu běhu, využitou paměť/CPU, objem přenesených dat a správu front, databází či úložišť. Optimalizace nákladů a výkonu spočívá ve vyvážení latence, propustnosti, spolehlivosti a predikovatelnosti rozpočtu. Tento článek nabízí praktickou metodiku, vzory a techniky, jak ze serverless přístupu vytěžit maximum při udržitelných nákladech.
Ekonomický model serverless
- FaaS (Functions-as-a-Service): účtování typicky za milisekundy běhu a přidělenou paměť, nepřímo i za CPU (škáluje s pamětí). Další položky zahrnují počet vyvolání, egress, triggery (fronty, API, cron).
- BaaS služby: managed databáze, fronty, streamy, storage. Účtování je za kapacitu, požadavky, replikace a síťové přenosy.
- Nákladová elasticita: ideálně lineární se zátěží. Pozor na skryté prahy (cold starty, limity paralelizace, throttling), které mohou zvyšovat jak latenci, tak cenu.
Strategie měření a řízení
- Definujte SLO: p95 latence, p99 latence, propustnost (RPS), chybovost a limity rozpočtu (měsíční/denní).
- Instrumentace: metriky invocations, duration, init duration (cold/warm), throttles, concurrency, errors, egress/ingress.
- Tracing: end-to-end distributed tracing (funkce → databáze → fronty) pro identifikaci úzkých hrdel a duplicitních volání.
- Experimenty: load testy s reálnými profily (burst, steady), A/B testování konfigurací paměti, regionů a caching vrstev.
Cold starty a warm starty
- Cold start vzniká při inicializaci runtime a závislostí. Projevuje se prodlouženým init při nízké obsazenosti poolu.
- Mitigace: minimalizace balíčku (tree-shaking, layering), lazy inicializace klientů, connection pooling v globálním kontextu, udržování teplých instancí (pro kritické cesty spíše přes provozní politiku než „ping“ joby).
- Jazyky: interpretované (JS, Python) mají rychlé starty, JVM/.NET vyžadují snapstart/AOT/Native Image, případně vyšší provisioned kapacitu pro latenci kritických endpointů.
Dimenzování paměti a CPU
Ve většině platforem se s přidělenou pamětí škáluje i CPU a I/O propustnost. Vyšší paměť může zkrátit dobu běhu a snížit cenu za požadavek (méně milisekund), přestože jednotková cena za milisekundu roste.
- Profilujte funkci s různými příděly (např. 256 MB, 512 MB, 1 GB, 2 GB) a sledujte produkt duration × price per ms.
- Identifikujte „koleno křivky“ – bod, kde další navýšení paměti nepřináší výrazné zrychlení.
- Pro CPU-bound úlohy zvažte vyšší paměť a využití vektorových knihoven nebo kompilaci (AOT), pro IO-bound optimalizujte připojení a paralelizaci.
Současné běhy (concurrency) a škálování
- Max concurrency: omezuje počet současných instancí. Příliš nízká hodnota vede k frontám a zvýšené latenci; příliš vysoká k vyčerpání downstream systémů (DB, API) a rapidnímu nárůstu nákladů.
- Rate limiting a backpressure: používejte message brokera nebo token bucket na vstupu; chraňte perzistentní vrstvy.
- Batching a fan-in: zpracovávejte více položek v rámci jednoho volání (v rámci limitů doby běhu a paměti).
Vstupní a výstupní (I/O) optimalizace
- Databáze: preferujte single round-trip, batch operace, idempotentní upsert, indexy. U serverless databází používejte spojení přes řízené konektory (proxy) pro škálovaný pooling.
- Storage: čtěte a zapisujte ve větších blocích; u velkých objektů zvažte pre-signed přístupy přímo z klienta (snížení egressu z funkcí).
- Sítě: minimalizujte cross-region komunikaci a egress; držte data a výpočet co nejblíže (ve stejném regionu/zone/edge).
Architektonické vzory pro výkon a náklady
- Strangler Fig: obalujte monolit funkcemi pouze v kritických cestách; zbytek ponechte v existující infrastruktuře.
- Event-driven a asynchronní workflow: fronty/streamy k vyrovnání špiček; saga nebo orchestrátor pro dlouhé procesy.
- Edge a CDN: pre-rendering, edge caching a validace tokenů na hraně uleví jádru a sníží egress.
- Compute near data: spouštějte funkce co nejblíže databázi/úložišti; vyhněte se „ping-pong“ mezi regiony.
Cache a znovupoužití výsledků
- Vrstvy cache: in-memory v rámci instance (pro warm módy), sdílená cache (Redis/serverless cache), CDN pro veřejné odpovědi.
- Deterministické klíče: cache key odvozený z parametrů volání; TTL dle volatility dat.
- Negative caching: krátké TTL i pro „not found“ a chyby, pro prevenci thundering herd efektu.
Optimalizace závislostí a balíčku
- Minimalizujte velikost balíčku (odstraňte nepoužité moduly, externals, aplikujte tree-shaking).
- Oddělte velké knihovny do layers a sdílejte je mezi funkcemi.
- Lazy inicializujte klienty a načítejte konfigurace z prostředí, ne pomocí dalších volání.
Řízení latence: p95 vs. p99
Optimalizace nákladů nesmí degradovat long-tail latenci.
- Monitorujte p99/p99.9 – věnujte pozornost cold startům, JIT/AOT, garbage collection a síťovým špičkám.
- Pro kritické cesty zvažte provisioned/reserved kapacitu a používání warm pools, které stabilizují p99 i za cenu vyšších fixních nákladů.
Observabilita a „cost APM“
- Cost per request: počítejte jednotkovou cenu běhu funkce plus náklady závislostí (DB, fronty, storage, egress).
- Cost heatmap: mapujte funkce podle (cena/požadavek, požadavků/den, p95) a zaměřte se na pravý horní kvadrant.
- Anomálie: nastavte alerty na skoky ve vyvoláních, duration, egressu, throttles a chybových sazbách.
Bezpečnost versus výkon
- Autentizaci a autorizaci provádějte co nejblíže vstupu (edge/JWT), ověřujte scope bez dalších round-tripů.
- Šifrování dat v klidu i za provozu zachovejte; hardwarová akcelerace a opakované využití připojení minimalizují režii.
- Rate limiting a WAF implementujte přímo v gateway/edge vrstvě, aby se drahé invokace vůbec nespouštěly.
Tabulka: páky výkonu a nákladů
| Oblast | Heblo | Dopad na výkon | Dopad na náklady | Poznámky |
|---|---|---|---|---|
| Paměť/CPU | Zvýšit o jeden stupeň | Nižší duration | Vyšší cena za ms | Hledejte koleno křivky |
| Concurrency | Omezit / navýšit | Stabilizace latence | Nižší/vyšší burst náklady | Chraňte DB/API |
| Caching | CDN/Redis/Local | Nižší latence | Nižší počet invokací | Správa TTL a invalidace |
| Batching | Zpracovat N položek | Vyšší propustnost | Méně invokací | Dodržení limitů runtime |
| Region | Blíže datům | Nižší síťová latence | Méně egress | Dopad na compliance |
Databázové vzory v serverless
- Read-optimized: materiálizované pohledy, denormalizace pro snížení počtu dotazů.
- Write-optimized: append-only s periodickou kompakcí, outbox pro spolehlivé eventy.
- Transakce: používejte idempotenci (klíče požadavků) a conditional writes pro přesně-jednou sémantiku.
Fronty, streamy a plánování
- Prefetch a paralelismus: nastavte šířku čtení podle kapacity downstream; max in-flight udržujte v bezpečném rozsahu.
- Retry a DLQ: exponenciální backoff, dead-letter fronty, idempotentní zpracování.
- Cron a plánovače: seskupujte dávky; dávejte pozor na start-of-hour thundering herd (používejte jitter).
Edge serverless
- Ultra nízká latence: validace, redirecty, jednoduché transformace na hraně.
- Omezený runtime: menší paměť, krátké limity; používejte kompaktní kód a bezstavové operace.
- Cache control:
Cache-Control, stale-while-revalidate, varianty dleVary.
Multiregion a dostupnost
- Active-active: global anycast + replikovaná data; pozor na konzistenci (RUM konzistence, read-your-writes tokeny).
- Failover: health-probing, automatické přepnutí DNS/traffic manageru, idempotentní retry.
- Kapitál vs. provoz: vyšší egress a replikace versus nižší penalizace výpadků.
Governance, FinOps a limity
- Rozpočty a alerty: nastavte budget alerts a quotas na projektech a účtech.
- Tagování: nákladová střediska, týmy, služby; pravidelná alokační reportování.
- Policy-as-code: vynucujte limity paměti, regionů, veřejné sítě a egressu.
Testování výkonu a nákladů
- Perf testy: simulujte reálné profily (burst, dlouhé fronty, nevhodné dávky). Měřte p99 latenci, chybovost, concurrency, egress.
- Cost replay: přehrávejte produkční logy na sandboxu; srovnejte jednotkové náklady variant.
- Chaos: testujte selhání downstream služeb, limity funkcí (timeout, paměť), výpadky regionu.
Checklist rychlých zisků
- Minimalizujte balíček funkcí, oddělte těžké moduly do layers.
- Optimalizujte paměť/CPU kombinaci na „koleno křivky“ ceny za požadavek.
- Zaveďte caching (edge + sdílená cache) a batchování.
- Omezte concurrency podle kapacity DB/API a aktivujte backpressure.
- Držte data a výpočet ve stejném regionu, redukujte egress.
- Mitigujte cold starty (AOT/snapstart, warm pools, lazy init).
- Nastavte budget alerty, tagování nákladů a cost heatmapy.
Příklady konfiguračních vzorů (ilustrativní)
- Paralelismus spotřebitele:
maxConcurrent=16,prefetch=64, batchSize 10–50, DLQ po 3 pokusech s exponenciálním backoffem. - Idempotence: Idempotency-Key v hlavičce, unikátní index v tabulce
requests(key), odpověď cache dle klíče. - DRS edge cache:
Cache-Control: public, max-age=60, stale-while-revalidate=300pro polostatické odpovědi.
Souhrn
Optimalizace nákladů a výkonu v serverless modelech je kontinuální disciplína: instrumentovat, profilovat,