Nakonec se vyhněte běžnému omylu, že cache vyřeší všechno. Cache na úrovni resolverů nebo HTTP pomůže, ale pouze pokud jsou data konzistentní a klíče správně navržené. U dynamických dotazů s proměnnými snadno dojde k záměně klíčů a klient dostane cizí data. Vždy cachujte podle plného kontextu dotazu, včetně oprávnění uživatele. A pamatujte, že ani sebelepší cache neomlouvá N+1 dotazy — ty je třeba odstranit dřív, než se pustíte do jakéhokoli cachování.
Prvním krokem je změřit, co se skutečně děje. Zapněte logování resolverů nebo použijte middleware, který měří dobu běhu každého pole. Často se ukáže, že pomalý není dotaz jako celek, ale jedna pole, která se volají stokrát. Zaměřte se na pole vracející seznamy a na vnořené objekty. Do produkce nasaďte práh, který při překročení počtu dílčích dotazů zaloguje varování. Bez měření budete optimalizovat naslepo a pravděpodobně špatné místo.
Na straně schématu se vyplatí zavést persisted queries. Klient místo celého dotazu pošle pouze jeho hash a server si dotaz dohledá. Odpadá opakované parsování a validace, navíc můžete snadno omezit, které dotazy jsou vůbec povolené. Pro veřejná API je to jeden z nejúčinnějších kroků, jak snížit režii. Pozor ale na aktualizace dotazů: pokud klient pošle neznámý hash, musí dostat srozumitelnou chybu, ne prázdnou odpověď. Jinak si rozbijete klientské aplikace a budete to řešit ve spěchu.
Častou chybou je čistit skvrnu horkou vodou a vydatným třením. Většina domácích nehod se tím jen zatlačí hlouběji. Pracujte s čistou bílou utěrkou, přitlačujte a nechte savý materiál odsát tekutinu. U neznámého potahu nejdřív vyzkoušejte prostředek na málo viditelném místě a počkejte, až uschne – některé látky reagují změnou barvy až po zaschnutí. Nikdy nemíchejte čisticí prostředky mezi sebou, vznikají výpary, které dětem vadí víc než samotná skvrna.
Software se na fyzické ochraně podílí víc, než se zdá. Zapněte automatické zálohování do cloudu nebo na externí disk, aby případná nehoda neznamenala ztrátu školních úkolů. Nastavte pravidelný úklid dočasných souborů a aktualizací, které jinak zpomalují start. Zvažte heslo nebo PIN, aby mladší sourozenec neprocházel nastavení a neměnil jas na maximum, což zahřívá displej i baterii.
Co dělat s hranou, která je tvrdá a ostrá Na rovnou hranu stačí samolepicí pěnový profil ve tvaru U nebo L. Před nalepením povrch odmasti a osuš, jinak páska povolí při prvním teple u topení. Profil kup v délce celé hrany, ne jen na roh – dítě se opírá i o střed. Rohy řeš samostatnými měkkými krytkami, které přesahují přes hranu, protože právě roh bývá nejtvrdší. Pokud je nábytek z masivu a hrana ostrá po opracování, nejdřív ji přebruš jemným papírem a zaobli, teprve pak lep ochranu.
Častou chybou je také ignorování fragmentů a direktiv. Klient pošle dotaz s mnoha fragmenty a server je všechny vyhodnotí, i když jsou podmíněné. GraphQL specifikace sice umožňuje direktivy @skip a @include, ale mnoho resolverů je nebere v úvahu dostatečně brzy. Zpracujte je už při validaci dotazu a odstraňte neaktivní části ještě před plánováním. Ušetříte nejen databázové dotazy, ale i práci s objekty, které by se stejně zahodily.
Dětský pokoj má jednu zásadní vlastnost: dítě v něm tráví hodně času pohybem, často ve spěchu a bez kontroly okolí. Hrana postele, nočního stolku nebo police ve výšce hlavy je přitom typickým místem, kde vzniká boule nebo rozbité obočí. Nejde o to pokoj obalit molitanem, ale najít místa, kam dítě reálně narazí, a ta zabezpečit tak, aby vydržela každodenní provoz.
N+1 problém v GraphQL není mýtus. Vzniká ve chvíli, kdy resolver pro pole vrací data po jednom pro každý záznam z rodičovského seznamu. Typicky: načtete seznam příspěvků a u každého resolver dotáhne autora zvlášť. Výsledkem je jeden dotaz na seznam a stovky dotazů na autory. Řešení je přitom přímočaré: použijte DataLoader nebo ekvivalentní dávkovací vrstvu. Ten sdruží požadavky v rámci jednoho cyklu událostí a pošle je do databáze jako jeden IN dotaz. Bez tohoto kroku se optimalizace dotazů neobejde, ať už je schéma sebečistší.
Nejdřív projdi pokoj v úrovni dětské hlavy a kolen. Klekni si na zem a podívej se, co trčí do prostoru: rohy postele, hrany komody, deska stolu, spodní hrana horní palandy. Změř, v jaké výšce dítě spí a kam dosáhne při hraní na zemi. Právě tyto dvě hladiny rozhodují o tom, co je potřeba chránit. Zbytek nábytku řešit nemusíš.
Hloubka dotazu a limity, které se snadno podcení GraphQL umožňuje klientovi sestavit libovolně hluboký dotaz. Pokud tomu nezabráníte, jediný požadavek může položit databázi. Zaveďte limit hloubky a limit počtu polí na dotaz. Obojí jde implementovat v analytické fázi dotazu, ještě před spuštěním resolverů. Pozor na výjimky pro legitimní klienty: příliš přísný limit zablokuje i rozumné dotazy. Osvědčuje se kombinace statického limitu a dynamického počítání složitosti podle vah jednotlivých polí. Hluboká optimalizace dotazů začíná právě tady, ne v indexech.
Add new comment