Když se dotazy v GraphQL zpomalují, začněte tady

Z Mazovia

Někdy se posunu nevyhnete — typicky u malého pokoje, kde je jediná volná stěna za těžkou skříní. V tom případě postupujte takto: nejdřív skříň úplně vyprázdněte, jinak se při posunu ohne dno nebo prasknou boky. Pod nohy dejte kluzké podložky nebo staré ručníky a posunujte po malých kouscích, ne trhnutím. U vysokých skříní hrozí převržení — nikdy je neposouvejte sami, vždy ve dvou a s jedním člověkem, který je jistí ze strany. Po přesunu zkontrolujte, zda skříň stojí rovně a zda se dvířka zavírají. Pokud ne, podložte nohu.

Kde host ztrácí čas a co ho zbytečně probouz

Během letu pomáhá rituál. Nastupte mezi prvními, pokud to jde, a hned po usazení vytáhněte jednu hračku, kterou dítě ještě nevidělo. Nová věc udrží pozornost déle než známá. Při startu a přistání dejte dítěti napít nebo něco kousat, polykání vyrovnává tlak v uších. Pokud začne plakat, nepanikařte a neomlouvejte se celému letadlu. Klidný dospělý je pro batole nejspolehlivější signál, že se nic zlého neděje.

Dvě stě kusů oblečení, knih, nádobí a drobných předmětů v bytě o rozloze kolem třiceti metrů čtverečních není otázka dobré vůle, ale matematiky. Nejdřív spočítejte, kolik máte skutečně úložného prostoru – změřte skříně, police, prostor pod postelí i šuplíky. Teprve pak rozhodujte, co kam patří. Typická chyba je začít třídit věci dřív, než víte, kolik místa je vůbec k dispozici. Bez tohoto čísla skončíte s hromadami na zemi a pocitem, že to nejde.

Na závěr se vyhněte třem chybám, které se opakují. První je snaha zastrčit vše do rohů, čímž vzniknou mrtvá místa, kam se nedostanete. Druhá je příliš mnoho dekorací na malé ploše; tři předměty vyniknou, deset vytvoří chaos. Třetí je nákup nábytku bez měření, který pak blokuje průchod. Malý byt nepotřebuje dokonalý design, ale rozhodnutí, která se dají dodržet každý den.

Nejčastější chyba je N+1: rodičovský seznam vrátí stovku položek a každá si sama dotáhne navázaný záznam. Řešením je dávkování a cachování na úrovni resolverů – sesbírejte klíče z jednoho cyklu událostí a udělejte jeden dotaz na databázi, výsledek rozdělte mezi resolvery. Stejný princip použijte i pro vzdálená volání. Dávejte pozor, aby dávkování neporušilo pořadí ani nevrátilo data, která uživatel nemá vidět: autorizaci vždy vyhodnocujte před načtením, ne až po něm.

Prvním krokem je zbavit se povrchů. Kuchyňská linka, parapety, noční stolky a police mají zůstat z velké části prázdné. Právě zaplněné plochy dělají z malého bytu sklad. Praktické je určit každé věci jednu konkrétní zásuvku nebo polici a nic neodkládat „někam, kde je místo". Pokud něco nemá místo, nemá v bytě co dělat. Pozor na typickou chybu: lidé nejdřív nakupují úložné boxy a teprve pak zjišťují, co do nich dají. Pořadí má být opačné.

Persistence dotazů (uložené dotazy podle hashe) snižuje velikost požadavků a zároveň brání ad-hoc dotazům z internetu. Pokud ji nasadíte, počítejte s tím, že vývojáři potřebují cestu, jak nový dotaz zaregistrovat, a že staré hashe nelze mazat, dokud je používají starší verze klienta. Stejně tak dejte pozor na cachování na HTTP úrovni: GraphQL obvykle používá POST, takže bez explicitních hlaviček a klíčů se nic necachuje. Pro veřejná data zvažte GET s normalizovaným dotazem, pro soukromá cachujte raději na úrovni resolverů s krátkou dobou platnosti.

Hloubka, složitost a limity jako první linie obrany Klient může poslat dotaz, který rekurzivně projde celý graf. Zaveďte limit hloubky a váhu dotazu – každé pole a každý seznam má cenu, součet se porovná s rozpočtem. Limity nastavte podle reálných dotazů z produkce, ne od stolu; příliš přísný limit rozbije legitimní klienty a příliš volný nic neřeší. Chybová odpověď má klientovi říct, co překročil, jinak si bude stěžovat, že „to občas nefunguje".

GraphQL je pohodlný pro klienta, ale drahý pro server. Jeden dotaz může snadno spustit desítky resolverů a několik databázových dotazů, které by v REST vznikly jen při ručním skládání několika volání. Než začnete cokoli optimalizovat, změřte to. Zapněte trasování resolverů a podívejte se, který field spotřebovává nejvíc času a kolik jich na jeden požadavek skutečně padne. Bez měření se optimalizace zvrhne v hádání a často zhorší to, co fungovalo.

U spojení se seznamy nepoužívejte offsetovou paginaci ve velkých kolekcích; kurzorová je stabilnější a levnější. Vždy vracejte jen pole, která klient opravdu použije – nadbytečná pole nejsou zdarma, protože se musí načíst, přenést a často i serializovat. Nakonec sledujte chování v produkci: pomalé dotazy logujte s otiskem a časem, ne s celým tělem, ať se do logů nedostanou citlivá data. Optimalizace, která není podložená metrikami, se po půl roce vrátí jako nový problém.