Dotazy v GraphQL zpomalují aplikaci kvůli N 1, který většina přehlédne
Než se pustíte do čtení popisků, všimněte si, co je u exponátu skutečně doloženo a co je jen doplněné. Typická chyba je brát repliku za originál a domýšlet si k ní dramatický příběh. U replik bývá uvedeno, podle čeho byly vyrobeny; pokud údaj chybí, berte předmět jako ilustraci, ne jako důkaz. Druhá častá chyba je číst legendu jako fakt. Muzejní texty obvykle rozlišují mezi tím, co plyne z archivního záznamu, a tím, co se traduje. Když to nerozlišíte, odnesete si domů historku, která se možná nikdy nestala.
Běžnou chybou je snažit se ušetřit tím, že se svítí jen stolní lampou a zbytek pokoje zůstane tmavý. Kontrast mezi jasným sešitem a černým okolím nutí oči přizpůsobovat se dvěma úrovním jasu najednou, což po hodině vede k bolesti hlavy. Vždy nechte svítit i slabší doplňkové světlo v místnosti, ideálně v jiném barevném odstínu, než má pracovní lampa. Večer také pomáhá stáhnout jas obrazovky na úroveň okolního osvětlení.
Na závěr si udělejte krátkou poznámku ještě v muzeu, dokud máte detaily v čerstvé paměti. Zapište si název exponátu, dataci a to, co vás na popisku zarazilo. Doma pak snáz odlišíte, co jste skutečně viděli, od toho, co k tomu domýšlí ostatní. Právě v tom spočívá hlavní přínos návštěvy: ne v hrůze, ale v pochopení, jak se z nástroje stane exponát a z události legenda.
U postelí s úložným prostorem přístupným zvednutím roštu platí jiné pravidlo: váha nákladu jde přímo na mechanismus a plynové vzpěry. Ty mají danou nosnost a při přetížení přestanou držet. Rošt pak padá a hrozí úraz. Pokud se rošt zvedá těžko nebo sám klesá, je to signál, že je náklad příliš těžký, nebo že vzpěry dosluhují. Nikdy nezkoušejte mechanismus „dorovnat" silou.
Hloubka dotazu a limity, které chrání server Druhá puťovka je neomezená hloubka a složitost dotazu. GraphQL umožňuje klientovi rekurzivně rozbalovat vztahy, a pokud server nestanoví limit, jeden požadavek může vygenerovat tisíce resolverů a shodit instanci. Zaveďte analýzu dotazu před jeho vykonáním: spočítejte hloubku, počet polí a odhadněte náklady podle váhy jednotlivých polí. Požadavky nad limit odmítněte srozumitelnou chybou, ne tichým zkrácením. Zároveň mějte pojistku na dobu běhu a na počet dávkových položek, protože i dobře navržený limit hloubky lze obejít širokým dotazem.
Častá chyba je optimalizovat jen dotazy, které vidíte v prohlížeči, a zapomenout na mobilní klienty, kteří posílají jiné kombinace polí. Sbírejte vzory dotazů z provozu, seskupujte je podle tvaru a optimalizujte ty nejčastější. Zároveň kontrolujte, zda resolver nevrací pole, o která klient nežádá — v GraphQL je to snadné nechat na automatickém mapování a pak zbytečně tahat celé řádky. Explicitně vybírejte jen požadované sloupce a u vnořených vztahů používejte dataloadery i tam, kde to na první pohled nevypadá potřeba.
Častou chybou je přesypávat postel dekou nebo přehozem, který se nesundavá. Ty pak drží prach a vlhkost a povlečení pod nimi nemá šanci uschnout. Další chyba je prát povlečení na příliš nízkou teplotu a bez dostatečného množství pracího prostředku – látka zůstane mastná a zápach se vrátí během jednoho dne. Naopak zbytečné je prát po každém použití, pokud člověk není nemocný nebo hodně zpocený. Sledujte látku: když je na dotek tuhá nebo cítíte zatuchlinu u hlavy, je čas.
Nejčastější příčinou pomalého GraphQL není databáze ani síť, ale to, jak resolver získává data pro vnořené objekty. Když klient požádá o seznam objednávek a u každé i její položky, naivní resolver zavolá databázi jednou pro objednávky a pak jednou pro každou objednávku zvlášť. při stovce objednávek to znamená stovku dotazů, které by šly sloučit do jednoho. Tomuto vzorci se říká N+1 a v produkci se projeví jako rostoucí latence úměrná velikosti seznamu. První krok není optimalizace dotazu, ale měření: zapněte trasování resolverů a podívejte se, kolik dotazů na databázi jeden požadavek skutečně vygeneruje.
Řešením je dávkování a cachování na úrovni resolverů. Místo okamžitého volání databáze resolver pouze zaregistruje požadavek na klíč a na konci tiku se všechny klíče sesbírají a načtou jedním dotazem s podmínkou „in". Knihovny pro dávkování to dělají automaticky, ale je potřeba je zapojit do každého resolveru, který sahá na databázi nebo vzdálené API — jinak zůstane N+1 jen na neošetřené větvi. Dávejte pozor na to, aby dávkovací klíč byl skutečně unikátní a nemíchal entity různých typů.
U persisting dotazů se vyplatí posílat hash místo celého textu. Server tak ověří, že klient posílá jen předem schválené dotazy, a odpadá riziko, že někdo pošle drahý ad-hoc dotaz. Pozor ale na to, že hash nestačí jako bezpečnostní prvek sám o sobě — musí být svázán s konkrétní verzí schématu, jinak po změně schématu přestane odpovídat a klienti začnou padat na chybě „dotaz nenalezen".