Zbyt głębokie zapytania GraphQL, které zničí výkon
První let s batoletem se láme na tom, kolik toho vezmete a jak naplánujete cestu na letiště. Většina rodičů podlehne panice a sbalí půl domácnosti. Batole přitom nepotřebuje tři náhradní kombinézy ani zásobu hraček na týden. Potřebuje vyspané rodiče, jídlo po ruce a jasný rytmus dne. Začněte tím, že si před odletem sepíšete, co dítě reálně použije během cesty. Všechno ostatní patří do odbaveného zavazadla.
Největší chyba: spoléhat na to, že dítě bude sedět Typická chyba je představa, že batole vydrží celý let na klíně nebo v sedačce bez pohybu. Nevyjde to. Připravte se na to, že budete vstávat, chodit po uličce a znovu usedat. Vezměte si oblečení, které se snadno sundá a vypere, a pro dítě vrstvy, ne tlustý svetr. Teplota v kabině kolísá. Na vzlet a přistání dejte dítěti pít nebo kousat něco měkkého, aby si uvolnilo uši. Pokud je nemocné nebo má ucpaný nos, zvažte odklad. Bolest uší umí udělat z klidného letu peklo.
Poslední věc je rutina před spaním. Dítě, které se před usnutím převaluje a hraje si, padá častěji než to, které má klidný režim. Zařaďte krátké čtení nebo tiché povídání vsedě na posteli, ne divokou honičku. Pokud dítě padá i po těchto úpravách opakovaně, nebo dokonce spadne bez probuzení, řešte to s dětským lékařem — může jít o poruchu spánku nebo o noční záchvat, který vypadá jako obyčejné skutálení.
Hloubka dotazu je první věc, kterou je potřeba ohlídat. GraphQL dovolí klientovi sáhnout libovolně hluboko do grafu, a pokud to neomezíte, jediný dotaz může stáhnout celou databázi do paměti. V produkci nastavte limit hloubky podle skutečných potřeb aplikace – obvykle stačí šest až osm úrovní. Limit ale nestačí sám o sobě: musí být vynucený na serveru ještě před spuštěním resolverů, ne až po načtení dat. Stejně důležité je omezit počet položek v seznamech, jinak se hloubkové omezení snadno obejde přes pole s polem.
Prvním krokem je zapnout trasování na úrovni polí. Potřebujete vidět, kolik volání databáze vzniklo z jednoho dotazu a jak dlouho každé trvalo. Často se ukáže, že jeden dotaz spustí stovky samostatných selectů, protože resolver načítá data pro každou položku seznamu zvlášť. To je klasické N+1 a v GraphQL je pravidlem, ne výjimkou. Řešením není omezit dotaz, ale sloučit načítání do dávek podle klíčů, které se v seznamu opakují.
Perzistentní dotazy a analýza provozu místo hádání Perzistentní dotazy (persisted queries) výrazně snižují režii. Klient místo celého dokumentu pošle krátký hash a server ho namapuje na uložený dotaz. Tím se zmenší provoz, ale hlavně zmizí možnost poslat libovolný dotaz zvenčí – povolené jsou jen ty, které jste předem zaregistrovali. Pozor na to, že hash musí odpovídat přesně; po jakékoli změně dokumentu je nutné registraci aktualizovat, jinak začnou selhávat požadavky, které dřív fungovaly.
S sebou mějte jen to, co zvládnete unést jednou rukou a co se vejde pod sedadlo. Praktické jsou přesnídávky v uzavíratelných obalech, vlhčené ubrousky, jedna oblíbená hračka a jedna nová, kterou vytáhnete až ve chvíli nudy. tablety a telefony nechte jako poslední záchranu, ne jako první volbu. Rodiče často chybují v tom, že dítěti pustí obrazovku hned po startu. Za hodinu je baterka v tahu a dítě znuzené. Střídejte aktivity po krátkých úsecích.
Po přistání nechte ostatní cestující odejít a vystupte mezi posledními. Ušetříte si tlačenici a dítěti dopřejete čas se probrat. První let s batoletem není o dokonalém výkonu. Je o tom, že přežijete oba a příště budete vědět, co vynechat. Nejčastější chybou totiž není málo věcí v tašce, ale příliš mnoho očekávání, že vše půjde hladce.
Většina týmů začne GraphQL dotazy řešit ve chvíli, kdy aplikace začne zamrzat nebo faktura za výpočetní výkon naroste. Do té doby se dotazy píší intuitivně: co potřebuji, to si vyžádám. Problém je, že GraphQL neposílá jeden požadavek, ale často desítky resolverů, které se navzájem volají. Než začnete cokoli optimalizovat, změřte reálné chování. Bez dat o tom, který resolver tráví časem a kolikrát se volá, skončíte u přepisování dotazů, které nebyly problémem.
Na závěr dvě pravidla, která se vyplácí dodržet. Zaprvé, komplexita dotazu se má počítat váženě – seznam s tisíci položkami není totéž jako skalární pole – a překročení limitu má vrátit chybu, ne tiše oříznout výsledek. Zadruhé, caching na úrovni polí zavádějte až po změření; předčasné cachování maskuje pomalé resolvery a při změně dat způsobuje nekonzistence. Omezení hloubky, dávkování, perzistentní dotazy a měření v provozu dohromady pokryjí většinu problémů, které výkon GraphQL API v praxi srážejí.