5 návyků, které zrychlí vaše GraphQL dotazy
Poslední věc, kterou většina rodičů podcení, je plánování do budoucna. Za dva roky se množství věcí změní, ale nábytek zůstane. Vyhněte se řešením na míru, která nelze přeskládat. Systém, kde se dají police přesouvat a díly kombinovat, vydrží déle než jedna velká skříň. A než cokoli koupíte, nechte dceru, ať si rozložení vyzkouší. Když jí nábytek nebude sedět, přestane ho používat a vy budete mít v pokoji drahý odkladač věcí.
Další častá chyba je cpát pod postel věci, které tam nepatří – třeba elektroniku, knihy nebo cokoli, co nesnáší prach. Prach se dostane i do zdánlivě uzavřeného boxu, pokud s ním často manipulujete. Pokud pod postelí skladujete oblečení, používejte vakuové pytle, ale počítejte s tím, že po odsátí vzduchu už do pytle nic nepřidáte. A hlavně: každý box označte, ať víte, co v něm je, a nemusíte ho celý vysypávat před použitím.
Základem je měřit, co skutečně odchází. Zapněte si na resolverech trasování a logujte dobu zpracování jednotlivých polí, ne jen celkového dotazu. Zjistíte, že jeden zdánlivě nevinný poddotaz na seznam položek generuje N+1 dotazů do databáze. Řešením není hádání, ale konkrétní nástroj: batching a dataloader, který seskupí požadavky na stejný typ entity do jediného dotazu. Bez tohoto kroku nemá smysl řešit cache ani indexy.
Před prvním nošením nechte boty doma na noze pět minut. Sledujte, jestli dítě nezakopává o špičku, nevyzouvá patu nebo nepláče při došlapu. První venčení omezte na deset až patnáct minut na rovném povrchu. Nepřidávejte hned dlouhou procházku do kopce. Po nazutí vždy zkontrolujte, zda není bota příliš utažená přes nárt – otlak se projeví už po pár krocích. Pokud dítě odmítá chodit, zkuste jiný model, ne silnější přesvědčování.
Častou chybou je obouvat boty násilím, držet nohu pevně a cpát prsty do špičky. Dítě si pak spojí boty s nepříjemným zážitkem a příště bude protestovat ještě víc. Další chybou je kupovat boty příliš velké s tím, že do nich dítě doroste. V příliš velké botě noha klouže, dítě zakopává a chůze se mu rozpadá. Stejně problematické je ale i koupit boty těsné. Vždy měřte nohu ve stoje, ideálně odpoledne, kdy může být noha mírně zvětšená.
Posledním návykem je testovat výkon průběžně, ne až před nasazením. Vytvořte sadu reprezentativních dotazů a spouštějte je při každé změně schématu nebo resolveru. Sledujte nejen průměrnou dobu, ale i nejhorší případy. Právě ty rozhodují o tom, zda aplikace zůstane použitelná i při špičce.
Třetím návykem je omezit velikost odpovědi. GraphQL vrací jen to, co si klient vyžádal, ale klient si může vyžádat tisíce položek v jednom seznamu. Zaveďte výchozí limit počtu vrácených záznamů a stránkování pomocí kurzoru. Když klient potřebuje více, ať si o další stránku řekne. Vyhnete se tak odpovědím, které zbytečně zatěžují síť i paměť. Současně hlídejte, aby se v odpovědi neopakovala stejná data vícekrát pod různými klíči.
Prvním návykem je měřit, co skutečně odchází ze serveru. Zapněte logování doby zpracování jednotlivých polí a sledujte, která resolver trvá nejdéle. Typická chyba: tým řeší dotaz na klientu, ale příčina je v tom, že resolver pro jedno pole spouští dotaz do databáze pro každý záznam zvlášť. Tento problém odhalíte jen na úrovni serveru, ne v prohlížeči. Bez měření ladíte naslepo.
GraphQL je populární proto, že klient si řekne přesně o data, která potřebuje. Jenže právě tahle volnost je i past. Neuvážené dotazy umí položit server i při malém provozu. Následujících pět návyků se vyplatí zavést dřív, než začne být s výkonem problém. Nejde o triky z blogů, ale o práci, která se dělá průběžně.
Omezte hloubku a složitost dotazu GraphQL ve výchozím nastavení nebrání tomu, aby klient poslal rekurzivní dotaz přes několik úrovní vztahů. Jeden takový dotaz dokáže vygenerovat tisíce databázových operací. Zaveďte limit na maximální hloubku dotazu a spočítejte složitost ještě před spuštěním. Knihovny pro analýzu AST to umí udělat za vás. Odmítněte dotaz, který přesáhne nastavený práh, a vraťte srozumitelnou chybu. Klienti se rychle naučí posílat rozumnější dotazy.
Čtvrtým návykem je udržovat schéma malé a srozumitelné. Každé nové pole je závazek, který bude někdo volat. Než pole přidáte, ověřte, zda se nedá vyřešit rozšířením existujícího typu. Zastaralá pole označte a po ověření, že je nikdo nepoužívá, je odstraňte. Příliš široké schéma vede k dotazům, kterým nikdo nerozumí, a k výkonnostním problémům, které se těžko hledají.
Druhým návykem je řešit N+1 problém dřív, než vznikne. To znamená seskupovat požadavky na data do dávek podle klíčů, které se v jednom cyklu zpracování opakují. Pokud resolver pro každý záznam volá stejnou databázi, je to signál, že chybí dávkování. Pozor na opačný extrém: příliš agresivní cacheování může vracet zastaralá data. Proto cache nastavujte jen tam, kde je jasné, kdy se data mění, a vždy s vědomím, jak dlouho může být hodnota neplatná.