GraphQL dotazy zbytečně brzdí, když ignoruješ N 1
Analýza provozu často ukáže, že většina polí se vrací, ale klient je nikdy nezobrazí. Zbytečně nafouknuté odpovědi zpomalují serializaci i přenos. Projdi reálné dotazy z logů a najdi pole, která se posílají jen kvůli tomu, že je někdo kdysi přidal do fragmentu. Odstraňuj je po domluvě s klientem, ne naslepo – fragment může být sdílený napříč obrazovkami.
Jak poznat, co vám sedne na ru
Typická chyba je tlačit postel co nejvíc do kouta a pak ji obestavět nočními stolky a policemi. Vznikne mrtvý prostor, do kterého se nedostanete s vysavačem ani s povlečením. Místo dvou stolků po stranách použijte jeden úzký stolek na volné straně a na druhé straně nástěnnou poličku. Pokud potřebujete úložný prostor, volte zásuvky přímo v konstrukci valendy, ne samostatné boxy, které ukrajují průchod.
Pátým signálem je nepříjemný pocit z vlastního hlasu. Pokud se při telefonování nebo nahrávání v obýváku slyšíte ostře a plechově, místnost klade zvuku přílišný odpor. Zkuste krátký test: nahrajte si na telefon krátkou větu vsedě na gauči a potom v jiné místnosti. Porovnání vám ukáže, zda je problém v místnosti, nebo v mikrofonu. Při úpravách postupujte po malých krocích a každou změnu vyzkoušejte při běžném poslechu. Akustika se neřeší najednou, ale postupným laděním, dokud místnost nezačne znít přirozeně a bez únavy.
Kam valendu postavit, aby neuzavřela ces
Než cokoli objednáte, projděte si cestu od vchodu do ložnice. Změřte šířku dveří, světlou výšku chodby, zákruty a schodiště. U rozkládacích a montovaných postelí se pt ejte, zda je možné je složit až v ložnici. U pevných rámů je rozhodující, zda projde největší díl. Pokud má dům úzké dveře nebo ostré zatáčky, může být řešením postel, která se montuje z menších částí, nebo matrace, která se ohne. Vždy si nechte potvrdit rozměry jednotlivých dílů v balení, ne jen celkovou velikost postele.
Persistované dotazy a pole, která nikdo nepoužívá V produkci nemá smysl parsovat a validovat stále stejné dotazy dokola. Persistované dotazy (persisted queries) odstraní z požadavku celý text dotazu a pošlou jen identifikátor. Ušetříš šířku pásma, snížíš riziko zneužití ad-hoc dotazů a získáš lepší přehled o tom, co klienti skutečně posílají. Zavedení vyžaduje krok navíc v build pipeline – klient musí dotazy zaregistrovat předem. Frequent chyba je zapnout povinné persistované dotazy naráz pro všechny klienty; starší verze aplikací v terénu pak přestanou fungovat. Přecházej postupně a měj po ruce fallback.
Na straně serveru se vyplatí omezit to, co resolver vůbec dělá. Pokud pole vrací jen přepočet z jiných polí, přesuň ho do rodičovského resolveru a spočítej jednou. U vzdálených volání nastav timeouty a circuit breaker; bez nich se pomalá závislost podepíše na celém dotazu. Kešování řeš na úrovni dotazu nebo entity, ne globálně, a vždy s klíčem, který obsahuje kontext oprávnění – jinak vrátíš data, na která uživatel nemá nárok.
Druhá věc, která se snadno podcení, je hloubka a tvar dotazu. GraphQL umožňuje klientovi sáhnout libovolně hluboko, a pokud to neomezíš, jeden dotaz může vygenerovat stovky resolver volání. Zaveď limit hloubky a limit složitosti (complexity score), který se počítá z počtu polí a násobí se podle vnoření. Oba limity nastav před nasazením, ne až po prvním incidentu. Pozor na chybu: limit hloubky sám o sobě nestačí, protože plochý dotaz s tisíci aliasy projde, aniž by byl hluboký.
Nakonec měř. Sleduj počet resolver volání na požadavek, dobu trvání jednotlivých polí a počet databázových dotazů. Bez těchto metrik optimalizuješ podle dojmů a snadno zpomalíš něco jiného. Zaměř se nejdřív na resolvery s nejvyšším počtem volání, ne na ty s nejdelším jednotlivým časem – součet bývá překvapivý.
Nejčastější příčina pomalých GraphQL dotazů není v samotném dotazu, ale v tom, co se děje pod ním. Resolver, který pro každou položku seznamu zavolá databázi nebo vzdálené API, vytvoří takzvaný N+1 problém: jedno pole vrátí dvacet položek a místo jednoho dotazu na databázi jich odejde dvacet jedna. Řešení je koncepční – sloučit požadavky do jednoho volání. V praxi to znamená zavést dávkování (batch loading) s mezipamětí per request, typicky přes DataLoader nebo jeho ekvivalent v tvém frameworku. Klíčové je, že dávkování musí být vázané na kontext jednoho požadavku, ne na globální stav aplikace, jinak si poděláš data mezi uživateli.