Když GraphQL zpomalí: chyby v dotazech, které zabíjejí výkon

Z Mazovia

Praktický detail: kamarád potřebuje i místo na věci. Pokud pohovka nemá úložný prostor, přidejte nízkou bednu, která se vejde pod ni, nebo polici nad lůžko. Nenechávejte spacáky a polštáře válet po zemi. A pozor na noční osvětlení — malá lampa u pohovky je lepší než ostré světlo ze stropu, které probudí i spícího bratra.

Většina týmů řeší výkon GraphQL až ve chvíli, kdy produkční API začne padat pod zátěží. Přitom nejčastější příčina nebývá infrastruktura, ale samotná struktura dotazů. GraphQL dává klientovi svobodu žádat přesně to, co potřebuje, a právě ta svoboda se snadno zvrhne v dotazy, které na serveru rozpoutají kaskádu stovek databázových operací. První krok k optimalizaci není přidat další server, ale podívat se, co klienti skutečně posílají.

Komunikace před příjezdem rozhoduje o polovině dojmu Napište hostovi jasné instrukce k příjezdu včas, ideálně dva dny předem. Uveďte, kde zaparkovat, kde je vstup, jak funguje zámek a co dělat, když se něco nepovede. Vyhněte se dlouhým zprávám, ale nešetřete na podstatných detailech. Častá chyba je poslat jen odkaz na mapu bez vysvětlení, kde přesně je vchod. Pokud je příjezd složitý, nahrajte krátké video nebo pošlete dvě tři fotky schodů a dveří. Host, který se v klidu dostane dovnitř, odpouští mnohem víc.

Socializace neznamená, že štěně seznámíte se vším a všemi. Znamená, že ho postupně a v jeho tempu učíte, že svět je předvídatelný a bezpečný. Začínáte doma, pokračujete na ulici a končíte v prostředích, která ho budou provázet celý život. Pokud štěně během prvních měsíců zaplavíte podněty bez možnosti úniku, vytvoříte si pes, který bude reagovat panicky nebo agresivně. Cílem není množství zážitků, ale kvalita a pocit kontroly.

Na vině bývá i vadné víčko chladiče nebo expanzní nádobky. To drží v systému tlak a tím zvyšuje bod varu. Když těsnění zestárne, kapalina vře už při nižší teplotě a uniká párou. Vyměňte ho preventivně spolu s chladicí kapalinou. Stejně tak se nevyplácí podceňovat stav oleje: málo oleje nebo příliš starý olej znamená horší odvod tepla z motoru. Měrku kontrolujte pravidelně, olej měňte podle předepsaného intervalu, ne podle pocitu.

N+1 problém a jak ho odhalit dřív, než ho pocítí uživatelé Nejčastější pastí je N+1 dotazování: resolver pro každý prvek seznamu zavolá databázi zvlášť. U seznamu tisíce položek to znamená tisíce dotazů. Řešením je dávkování a seskupování požadavků do jednoho volání, typicky přes dataloader, který v rámci jednoho tiknutí smyčky událostí spojí všechny požadavky na stejný typ entity. Pozor na dvě věci: dataloader musí být vytvořen pro každý požadavek zvlášť, jinak si klienti navzájem promíchají data nebo si podržíte v paměti celý výsledek předchozího volání. A druhá věc — dávkování samo o sobě nestačí, pokud databázové dotazy nemají indexy na cizích klíčích.

Rozkládací pohovka pro spání kamaráda v chlapeckém pokoji vypadá jako jednoduché řešení. Jenže právě tady vzniká nejčastější chyba: rodiče koupí pohovku podle vzhledu a zapomenou změřit, kolik místa zbude po rozložení. V malém pokoji se pak pohovka nedá plně roztáhnout, nebo blokuje dveře i skříň. Než cokoli koupíte, změřte pokoj metrem a nakreslete si na papír, kudy se bude pohovka rozkládat. Počítejte i s tím, že kamarád potřebuje kolem lůžka alespoň kousek místa, aby si mohl stoupnout.

Nezapomínejte ani na cache. GraphQL má jednu nepříjemnou vlastnost: jeden endpoint znamená, že klasické HTTP cache na úrovni URL nefunguje. Musíte cachovat na úrovni resolverů nebo použít normalizovanou cache na klientovi. Na serveru pomůže krátkodobé ukládání výsledků drahých polí nebo odvození cache klíče z tvaru dotazu a vstupních argumentů. U polí, která se mění jen zřídka, je to nejlevnější zrychlení, jaké můžete udělat.

Čalouněné čelo postele není jen dekorace. Určuje, kam až matrace dosáhne, jak vysoko bude lůžko a jestli se o čelo dá opřít. U šířky 160 až 180 cm se ale nejčastěji chybuje v tom, že se matrace vybírá podle ceny nebo tvrdosti, zatímco rozhodující je výška a tloušťka. Ty totiž musí ladit s čelem, jinak vznikne mezera, nebo matrace čelo překryje a čalounění se rychle opotřebí.

Základním nástrojem zůstává analýza nákladů dotazu. Každému poli přiřaďte váhu nebo použijte výpočet složitosti založený na hloubce a násobení seznamů. Server pak může dotaz odmítnout ještě před spuštěním resolverů, pokud překročí definovaný limit. Bez tohoto omezení se dřív nebo později objeví klient, který si v jednom požadavku vyžádá celý katalog i s vnořenými vazbami a položkami objednávek. Limity nastavte realisticky podle reálného provozu, ne podle teoretického maxima.