GraphQL dotazy zbytečně brzdí: chyba, kterou odhalí až provoz
Druhou častou chybou je ignorování cache na úrovni resolverů. Data, která se nemění každou sekundu, se dají ukládat krátkodobě do paměti a sdílet mezi požadavky. Pozor ale na kontext: cache musí být vázaná na oprávnění uživatele, jinak snadno vrátíte data, na která klient nemá nárok. Oddělte veřejná data od uživatelských a pro ta druhá cachujte opatrně nebo vůbec.
Zásadní je i směr svitu. Pásky mířící přímo do očí vypadají na fotce efektně, ale při čtení nebo vstávání oslňují. Namiřte je mírně ke zdi nebo k zemi a použijte difuzní profil. Ten rozptýlí body do spojitého pruhu a odstraní i tmavé mezery mezi jednotlivými diodami. Bez profilu se každá dioda zobrazí jako samostatná tečka, což u záclony vynikne dvojnásob.
Malý pokoj pro dítě není problém, který se dá vyřešit jednou návštěvou nábytkářství. Je to série rozhodnutí, z nichž každé ovlivní, kolik místa skutečně zůstane na hraní, učení i spaní. Nejdřív změřte pokoj přesně – včetně výšky stropu, šířky dveří a pozice radiátorů a zásuvek. Pak si na papír napište, co dítě doopravdy potřebuje denně: postel, místo na oblečení, pracovní plochu a úložiště na hračky. Všechno ostatní je volitelné a dá se to řešit později.
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.
Hmotnostní limit je další věc, kterou lidé přehlížejí. Výrobce uvádí maximální zatížení pro každé lůžko zvlášť a často i pro celou konstrukci. Teenageři rostou a při hře na posteli snadno limity překročí. Vysvětlete jim, že skákání na lůžku, houpání na zábradlí a věšení se na horní palandě patří k nejčastějším příčinám převržení. Stejně rizikové je používání postele jako žebříku pro dosažení na polici nebo při hraní her.
Zvolte jednu dominantní barvu a dvě podpůrné. Dominantní patří na velké plochy – stěnu, pohovku, závěsy. Podpůrné se objevují v menším množství: polštáře, váza, rám obrazu, lampa. Pokud chcete klid, držte se odstínů ve stejné teplotě, tedy buď všechny teplé, nebo všechny studené. Míchání teplé béžové se studenou šedou bez prostředníka vypadá jako omyl, ne jako záměr. Prostředníkem může být dřevo, které obě teploty spojí.
Na závěr: optimalizace není jednorázový úkol. Dotazy se mění s tím, jak se mění obrazovky aplikace. Zaveďte pravidelnou kontrolu pomalých dotazů a sledujte, jak se chovají po každém vydání. Bez měření a limitů se vrátíte tam, kde jste začali, jen s větší důvěrou v to, že je vše v pořádku.
U osvětlení ověřte, zda LED pásky nejsou jen ztlumené nebo vypnuté v režimu, který si postel pamatuje po posledním použití. Zkuste světlo zapnout samostatným tlačítkem, ne přes scénu, a projeďte celý rozsah jasu. Pokud se pásek rozsvítí jen částečně nebo bliká, jde spíš o problém napájení pásku nebo o uvolněný spoj mezi páskem a konektorem, ne o ovladač.
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í.
Hloubka dotazu a limity, které většina vynechá GraphQL dovoluje klientovi sestavit libovolně hluboký dotaz. Pokud neomezíte hloubku a složitost, jeden klient může poslat dotaz, který projde stovkami uzlů a zablokuje backend. Zaveďte tvrdý limit hloubky a počtu polí na dotaz a vracejte chybu dřív, než se cokoli začne načítat. Stejně důležité je omezit aliasy a fragmenty, které útočník nebo nepozorný vývojář může zneužít k obejití limitu. Limit nastavte podle skutečných potřeb frontendu, ne podle toho, co všechno by šlo teoreticky vyžádat.
U mutací se vyplácí vracet jen to, co klient skutečně potřebuje. Často se stává, že mutace vrací celý objekt včetně vnořených vazeb, přičemž frontend využije jediné pole. Zbytečně to prodlužuje transakci a zvyšuje riziko zámku v databázi. Stejně tak se vyhněte tomu, aby se v jednom dotazu míchaly čtení a zápisy bez jasného důvodu.