Pomalé dotazy GraphQL: vrstvení resolverů, které zabíjí výkon

Z Mazovia
Wersja z dnia 23:42, 31 paź 2026 autorstwa AngieS29138 (dyskusja | edycje) (Utworzono nową stronę "Na co se ptát dřív, než zaplatí<br><br>Persisted queries a omezení toho, co se dá poslat Trvalé dotazy jsou v roce 2026 spíš nutnost než optimalizace. Klient pošle místo celého textu dotazu jen identifikátor a server ví předem, jaký tvar dotazu očekávat. Získáte tím tři věci: menší provoz, možnost dotaz předem zkontrolovat a hlavně konec toho, aby kdokoli posílal ad hoc struktury proti produkci. Pozor ale na verze — pokud se text do…")
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)

Na co se ptát dřív, než zaplatí

Persisted queries a omezení toho, co se dá poslat Trvalé dotazy jsou v roce 2026 spíš nutnost než optimalizace. Klient pošle místo celého textu dotazu jen identifikátor a server ví předem, jaký tvar dotazu očekávat. Získáte tím tři věci: menší provoz, možnost dotaz předem zkontrolovat a hlavně konec toho, aby kdokoli posílal ad hoc struktury proti produkci. Pozor ale na verze — pokud se text dotazu změní a identifikátor zůstane, dostanete nesoulad, který se projeví až při běhu. Zaveďte kontrolu hashe při každém nasazení a staré identifikátory držte v karanténě, dokud se klienti nepřesunou.

Seznam nestačí, potřebujete jídelníč

Kdy je lepší dvě oddělené matrace než jedna velká? Užší prostor často znamená, že každý potřebuje jinou tvrdost. Dvě matrace vedle sebe v jedné konstrukci vyřeší rozdílné nároky na záda a zároveň zabrání tomu, aby se pohyb jednoho přenášel na druhého. Pozor na mezery mezi matracemi, do kterých se dá zapadnout. Řešením je spojovací pruh látky nebo matrace s pevným okrajem. Pokud máte pouze jednu matraci, investujte do kvalitního chrániče, který sjednotí povrch a zabrání posunu prostěradla. To je levnější než měnit celou sestavu.

Druhá past spočívá v tom, že vývojáři optimalizují dotaz, ale ignorují, co klient skutečně posílá. GraphQL umožňuje klientovi vyžádat libovolně hluboký výběr, a pokud server nemá limit hloubky a složitosti, jeden dotaz může položit celý backend. Zaveďte měření složitosti ještě před spuštěním resolverů: každé pole přiřaďte váhu, násobení u seznamů a pevný strop na celkový součet. Odmítněte dotaz dřív, než se vůbec dostane k datům.

Digestoř: filtr namočte na půl hodiny do horké vody s octem a lžící sody, potom opláchněte a nechte důkladně uschnout. Mokrý filtr je sám o sobě zdrojem pachu. Troubu a plechy zbavíte mastnoty pastou ze sody s trochou vody; naneste, nechte působit přes noc, setřete a nakonec přetřete hadrem namočeným v octě. Uvnitř chladničky postavte misku se sypkou sodou, kterou každé dva týdny vyměňte, a jednou za čas otřete police roztokem vody a octa v poměru tři ku jedné.

Poslední věc, která v malém bytě rozhoduje nejvíc, je rituál ukládání. Postel, která slouží i přes den jako gauč, potřebuje každý večer krátkou přípravu: převléknout povlak, srovnat vrstvy, odložit věci na jedno místo. Udělejte z toho dvouminutový zvyk, ne projekt na hodinu. Pokud se večer opakovaně hádáte o tom, kdo co uklidí, rozdělte role natrvalo. Jeden připraví lůžko, druhý zkontroluje větrání a zhasne. Malý prostor neodpouští chaos, ale dobře nastavené návyky v něm fungují stejně dobře jako ve velké ložnici.

Větrání a teplota rozhodují o tom, jak se bude spát ve dvou v jedné místnosti víc než cokoli jiného. Dva lidé produkují znatelně víc tepla a vlhkosti. Před spaním vyvětrejte krátce a intenzivně, ne celý večer na mikroštěrbinu. Přes noc nechte proudit vzduch z chodby nebo jiné místnosti, pokud to dispozice dovolí. V zimě se vyhněte přímému foukání na hlavu. Typická chyba je přitápět na vysokou teplotu a pak si stěžovat, že se v noci budíte. Chladnější vzduch s dostatečnou přikrývkou funguje spolehlivěji.

U federace a více služeb se vyhněte tomu, aby se stejná entita načítala několikrát v jednom stromu. Resolver by měl nejdřív zjistit, jestli data už nejsou v kontextu požadavku, a teprve pak jít dál. Sdílený cache klíčovaný podle typu entity a identifikátoru výrazně sníží počet volání mezi službami. Nepoužívejte ale globální cache bez rozlišení tenanta — to je klasická chyba, která prosakuje data mezi uživateli.

Nejčastější příčina pomalého GraphQL není databáze ani síť, ale takzvaný N+1 problém na úrovni resolverů. Když pole vrací seznam a každý prvek si pod sebou tahá vlastní data, počet dotazů roste lineárně s velikostí výsledku. Řešením je dávkování: sesbírejte všechny požadované identifikátory v rámci jednoho cyklu vyhodnocení a načtěte je jedním dotazem. V praxi to znamená zavést dávkovací vrstvu mezi resolvery a datový zdroj, která sloučí požadavky podle klíče a výsledky rozdělí zpět. Bez tohoto kroku nepomůže ani sebelepší indexace.

Nakonec měřte. Bez trasování jednotlivých resolverů uvidíte jen celkovou dobu a budete hádat. Zaznamenejte počet volání datového zdroje na jeden požadavek, dobu strávenou v každém poli a podíl dotazů, které narazily na limit složitosti. Tato trojice čísel ukáže, jestli je problém v dávkování, v příliš benevolentních limitech, nebo v tom, že klient posílá zbytečně široké výběry. Optimalizace bez těchto dat je jen přepisování kódu naslepo.