N+1 dotazů v GraphQL, který zbytečně zabíjí váš výkon
Před nasazením nechej chatbot projít rodilým mluvčím, který zná cílovou skupinu. Ne překladatelem, ale člověkem, který s jazykem denně pracuje. Ať projde všechny scénáře: pozdrav, dotaz na produkt, reklamaci, stížnost i ukončení konverzace. Zaznamenej, kde bot nerozumí, a doplň trénovací data. Po nasazení sleduj, jaké zprávy lidé píšou, a každý týden přidávej nové varianty. Lokalizace není jednorázový úkol. Je to provozní činnost, která rozhoduje o tom, zda bot pomáhá, nebo obtěžuje.<br>
<br>
<br>
<br>
Druhým místem, kde se výkon ztrácí, je hloubka dotazu. GraphQL dovoluje klientovi napsat cokoliv, a tak se snadno stane, že si aplikace vyžádá strom dat do deseti úrovní. Nestačí jen omezit počet položek v seznamu. Je potřeba zavést analýzu dotazu před jeho vykonáním a spočítat jeho složitost. Každému poli přiřaďte váhu a nastavte strop, po jehož překročení dotaz odmítnete. Tím zabráníte jak neúmyslným chybám ve frontendu, tak útokům, kdy se někdo snaží server položit jediným požadavkem.<br>
<br>
<br>
<br>
Když se děti budí jedno kvůli druhému i po několika týdnech, oddělte spánek. Nemusí jít o nový pokoj. Stačí závěs z těžké látky od stropu k zemi nebo posuvná přepážka. Závěs pohlcuje zvuk a vytvoří pocit soukromí. Oddělení ale nefunguje, pokud je v pokoji příliš suchý vzduch nebo horko. Vydýchaný vzduch ve dvou zvyšuje rýmu a kašel. Větrejte před spaním deset minut a udržujte teplotu kolem 18 stupňů.<br>
<br>
<br>
<br>
Začněte výběrem kamenů. Ideální jsou hladké čedičové nebo žulové valouny o velikosti dlaně, bez prasklin a ostrých hran. Nasbírané z řeky stačí, ale před prvním použitím je properte v horké vodě a nechte vyschnout. Prasklý kámen se může v teple rozlomit a způsobit popáleninu. Proto každý kus před zahřátím prohlédněte proti světlu a odložte ty, které mají viditelné trhliny.<br>
<br>
<br>
<br>
Cacheování je užitečné, ale jen s rozmyslem. Cacheovat odpovědi na úrovni celého dotazu je lákavé, ale při častých změnách dat vede k zastaralým výsledkům. Lepší je cacheovat jednotlivé entity podle ID a invalidovat je cíleně. U dotazů, které se nemění, použijte HTTP cache nebo perzistentní dotazy. Tím snížíte zátěž i síťovou režii, protože klient neposílá celý dotaz znovu.<br>
<br>
<br>
<br>
Koutek, který není jen na okra<br>
<br>
<br>
<br>
Nejčastější chyba je pouštět večer obrazovky v pokoji. Modré světlo oddaluje usnutí a děti se pak vzájemně ruší. Druhá chyba je vyprávění před spaním nahlas pro oba. Lepší je pustit krátkou nahrávku do sluchátek nebo číst každému zvlášť dvě minuty. Třetí chyba je trestat buzení. Místo trestu zaveďte pravidlo: kdo se vzbudí, zůstane ležet a nedovolá se druhého. Pomáhá bílý šum z malého reproduktoru, který překryje zvuky z ulice i z postele vedle.<br>
<br>
<br>
<br>
Častou chybou je také ignorování toho, co klient skutečně potřebuje. Resolvery často načítají kompletní záznam včetně velkých textových polí, i když si klient vyžádal jen identifikátor a název. GraphQL poskytuje informaci o vybraných polích, takže se dá zjistit, která pole jsou potřeba, a načíst jen je. U relačních databází to znamená vybrat konkrétní sloupce, u dokumentových databází omezit projekci. Ušetří to přenos i paměť a často i čas strávený serializací.<br>
<br>
<br>
<br>
Rituál horkých kamenů není soutěž v odolnosti. Je to nástroj, který má uvolnit svaly a zklidnit dech. Když ho budete dělat dvakrát týdně, poznáte rozdíl v tom, jak ráno vstáváte z postele. Stačí hrnec, voda, tři kameny a patnáct minut klidu.<br>
<br>
<br>
<br>
Cache na úrovni polí místo celých odpovědí Sdílená cache celých odpovědí funguje jen do chvíle, než si každý klient vyžádá jinou kombinaci polí. Mnohem lepší je cachovat jednotlivá pole nebo entity podle jejich identifikátoru. Když se stejná entita objeví ve více dotazech, server ji vrátí z paměti a nezatěžuje databázi. Klíčem je konzistentní identifikace objektů a krátká expirace, která odpovídá tomu, jak často se data skutečně mění. Pozor na to, že cache musí respektovat oprávnění uživatele. Pokud ji sdílíte mezi uživateli bez ohledu na jejich práva, dostanete se k datům, která vidět nemají.<br>
<br>
<br>
<br>
Nejčastější chyba při optimalizaci GraphQL nespočívá v samotném dotazu, ale v tom, jak resolver načítá data. Když pole vrací seznam a každý prvek si sám dotahuje související záznam z databáze, vzniká takzvaný N+1 problém. Uživatel pošle jeden dotaz, ale server vykoná stovky SQL dotazů. Výsledek je pomalý a zatížení databáze roste lineárně s velikostí odpovědi. Řešení je přitom známé: dávkové načítání. Místo jednoho dotazu na prvek sesbírejte klíče a načtěte je jedním dotazem s podmínkou IN. Většina moderních knihoven pro GraphQL už dávkování podporuje, stačí ho správně nakonfigurovat a nepředávat resolverům vlastní databázové spojení místo kontextu s dávkovačem.





