Když GraphQL dotazy zůstanou neoptimalizované, platíte latenci

Aus Rettungsdienst-Wiki
Zur Navigation springen Zur Suche springen

Nejdřív si ujasněte, kde a jak budete číst. Jinou lampu potřebuje člověk, který čte vsedě s knihou na klíně, a jinou ten, kdo při čtení leží na boku a má knihu téměř u obličeje. Změřte si vzdálenost od místa, kam lampu postavíte, k textu. Čím blíž je světlo k papíru, tím menší výkon potřebujete a tím méně bude rušit okolí. Zároveň platí, že příliš blízko umístěný zdroj vytváří ostré přechody mezi světlem a stínem, což unavuje oči víc než slabší, ale rovnoměrné světlo.

Zásadní je výměna zastaralých žárovek a halogenů za LED. Moderní LED svítidla mají při stejném světelném výkonu několikanásobně nižší příkon a vydrží výrazně déle. Pozor ale na dvě věci: barvu světla (teplá bílá působí příjemněji, studená bílá lépe osvětlí cestu) a krytí. Venku musí mít svítidlo alespoň IP44, u přímo vystavených míst IP65. Podcenění krytí vede k zatečení a rychlému selhání, i když má LED jinak skvělou účinnost.

Nakonec si dejte pozor na jednu věc, kterou většina lidí podcení: kov se leskne a odráží okolí, takže zdvojnásobuje každý nepořádek. Dřevo nepořádek pohlcuje, kov ho zvýrazňuje. Pokud je v obýváku hodně věcí, zvolte kov matný a v menším množství. A pokud si nejste jistí, začněte od největších ploch – podlaha, stůl, police – a kov přidávejte až jako poslední vrstvu. Vznikne tak prostor, kde dřevo hřeje a kov jen decentně drží linie.

Dvě stěny v podkrovním pokoji obvykle znamenají jediné: šikminy, které se sbíhají tak vysoko, že mezi nimi zbývá jen úzký pruh použitelné podlahy. Právě tam se snaží většina lidí vecpat postel nebo skříň a pak se diví, že se v místnosti nedá dýchat. Rozhodující není, kolik toho nacpete pod šikminy, ale kde v místnosti zůstane místo, kde se dá stát vzpřímeně a kam dosáhne denní světlo.

Pozor na cache. GraphQL typicky jede přes POST, takže HTTP cache nefunguje. Řešení je CDN s podporou POST nebo přechod na GET pro čtecí dotazy s krátkými dokumenty. Na úrovni resolverů používejte cache s klíčem, který obsahuje všechny vstupní argumenty. Pokud pole závisí na uživateli, nezapomeňte ho zahrnout do klíče, jinak si podstrčíte cizí data.

Poslední věc: sledujte velikost odpovědi. Optimalizace dotazu je k ničemu, když klient stahuje megabajty zbytečných polí. Zapněte perspektivu, kde uvidíte, která pole se skutečně používají, a ta nepoužívaná ze schématu odstraňte. Deprekovat můžete postupně, ale mrtvá pole jen matou a zpomalují každý dotaz.

Postel umístěte pod nejvyšší bod místnosti, ne pod šikminu. Potřebujete nad sebou prostor na převlečení a na to, abyste si v noci neuhodili hlavu. Pokud je nejvyšší bod uprostřed, postel dejte tam a po stranách nechte volný průchod. Skříň naopak patří ke stěně, kde je strop nízký – ale pozor, dveře skříně se musí dát otevřít. Typická chyba je skříň hlubokou 60 centimetrů vsunout tak daleko, že se dveře otevřou jen do půlky a vy vytahujete oblečení bokem. Raději zvolte nižší a širší skříň, která se vejde pod šikminu i s otevřenými dvířky.

Persistované dotazy jsou další krok. Místo posílání celého dokumentu pošle klient hash a server ho namapuje na uložený dotaz. Ušetříte přenos, ale hlavně získáte kontrolu nad tím, co se na serveru skutečně provozuje. Whitelist známých dotazů zabrání tomu, aby někdo poslal neomezený dotaz mimo vaše nástroje. V roce 2026 je to standard i u menších API.

Hloubka a komplexita dotazu místo slepé důvěry GraphQL umožňuje klientovi sestavit libovolně hluboký dotaz. Bez omezení se snadno stane, že jeden request vygeneruje tisíce resolverů. Zaveďte limit hloubky (obvykle 7–10 úrovní) a analýzu komplexity, kde každému poli přiřadíte váhu. Knihovny jako graphql-depth-limit nebo graphql-query-complexity to zvládnou. Překročení vracejte jako chybu s jasnou zprávou, ne jako timeout, který klient nepochopí.

Většina týmů řeší výkon GraphQL až ve chvíli, kdy se na produkci objeví pomalé odpovědi. Přitom stačí pár návyků při psaní dotazů a návrhu schématu. Základ je měřit. Bez zapnutého trasování resolverů nepoznáte, který field spotřebovává čas. Apollo Studio, GraphQL Yoga s pluginem pro tracing nebo jednoduchý middleware s časovačem stačí. Zaměřte se na p99 latenci, ne na průměr – průměr schovává problémy.

Nejčastější chyba je N+1 dotaz. Resolver pro pole `author` uvnitř seznamu článků zavolá databázi pro každý článek zvlášť. Řešení je DataLoader pro batchování a cachování v rámci jednoho requestu. DataLoader vytvořte v kontextu požadavku, ne globálně, jinak si předáváte data mezi uživateli. Stejný princip použijte pro jakýkoli zdroj – REST API, SQL i externí služby.