N 1 dotazů v GraphQL, který zbytečně sráží odezvu

From BloomWiki
Jump to navigation Jump to search

Jak poznat, že botičky sedí a kdy je sund

Keramická rovnátka vypadají nenápadně, ale jejich údržba je náročnější než u kovových. Keramika je poréznější a náchylnější k zachycení pigmentů z jídla a nápojů. Zatímco kovové drátky a zámečky stačí jen mechanicky čistit, keramika vyžaduje důslednost a správnou techniku. Základem je pochopit, že průhledný materiál časem mění barvu, pokud ho nechráníte před barvivy a zbytkami potravy.

Hloubka a složitost místo slepé důvěry v klienta Druhá past je neomezená hloubka dotazu. Klient může poslat rekurzivní strukturu, která projde validací, ale databázi položí. Zavedeno má být měření složitosti podle počtu polí a násobení u seznamů, ne jen podle hloubky. Konkrétní limit nastav podle reálného provozu: jeden typ dotazu snese tisíce, jiný jen desítky. Překročení nesmí skončit obecnou chybou, ale srozumitelným odmítnutím, aby klient věděl, že má dotaz zjednodušit.

Typická chyba je snažit se zahřát aktivitou. „Rozhýbej se, bude ti teplo" platí jen do chvíle, než se objeví třes a zpomalené reakce. Další běžná chyba je rozdělení skupiny: jeden jde pro pomoc, ostatní zůstanou bez zkušeného vedení. Pokud je stav středně vážný, celá skupina se přesune do bezpečí společně a pomalejším tempem. Nikdy nenechávejte postiženého samotného, ani na pár minut. A nepodceňujte ani situaci, kdy se člověk sám cítí dobře – právě tehdy dělá největší chyby.

Pozor na to, že cachování na úrovni HTTP tady často nefunguje. Dotazy chodí na stejnou adresu, ale s jiným tělem, takže se klíč cache tvoří špatně. Místo plošného cachování používej perzistentní dotazy: klient pošle hash, server podle něj najde uložený dokument. Tím se zmenší provoz, zjednoduší validace a odstraní se celá třída útoků založených na skládání dotazů za běhu.

Prvním krokem je změřit skutečný prostor. Vezměte metr a změřte šířku dveřního křídla i to, kam až se dveře otevřou. Často se zapomíná na radiátor pod oknem nebo na vypínač, který musí zůstat přístupný. Pokud dveře ústí do rohu, kde je i okno, vzniká takzvaný mrtvý klín. Ten se nevyplatí zaplňovat, protože by znemožnil větrání i průchod. Místo toho sem umístěte něco nízkého a mobilního, například nízký úložný box na kolečkách, který se dá kdykoli odsunout.

Nezapomeň na to, co se děje uvnitř resolveru. I když je dávkování správné, můžeš ztratit čas na serializaci velkých objektů nebo na zbytečném načítání polí, která klient nechce. Vracej jen to, co je v selekci, a těžké výpočty odkládej mimo hlavní cestu. Typická chyba je načíst celý objekt i s vnořenými vazbami, protože se to hodilo pro jiný případ. GraphQL odměňuje přesnost; každé pole navíc se násobí počtem položek.

Většina onemocnění ryb nevzniká z ničeho nic. Jsou důsledkem dlouhodobě zanedbávané rovnováhy v nádrži. Když se voda zkazí, ryby oslabí a patogeny, které běžně přežívají v akváriu, dostanou šanci. Prevence proto není o lécích, ale o každodenní rutině. Těchto pět návyků zabere denně jen pár minut a dokáže zabránit většině problémů.

Nejčastější příčina pomalého GraphQL není databáze ani síť, ale to, že resolver volá data pro každou položku seznamu zvlášť. Tomuto vzorci se říká N+1 a vzniká nenápadně: rodičovský resolver vrátí dvacet záznamů a každý potomek si pak vyžádá vlastní dotaz. V RESTu se tomu člověk často vyhne ručním spojením, v GraphQL to ale vypadá přirozeně, protože pole se resolvují samostatně. Řešení není v optimalizaci SQL, ale ve sloučení požadavků ještě před tím, než se dostanou do datové vrstvy.

Než začneš cokoli optimalizovat, změř to. Zapni trasování po jednotlivých resolverech a sleduj, kolik dotazů vzniká na jeden požadavek. Teprve potom sáhni po dávkování, limitech a perzistentních dotazech. Bez měření se snadno stane, že zrychlíš část, která není problém, a ta skutečná úzká místa zůstanou skrytá až do chvíle, kdy přijde provoz.

Základem je dávkování. Místo jednoho dotazu na položku posbírej během jednoho taktu všechny klíče, které potomci potřebují, a načti je jedním dotazem s klauzulí IN. Když to uděláš ručně, brzy se ti rozpadne logika mezi resolvery. Proto se vyplatí zavést malý zavaděč, který po dobu jednoho tiku sbírá klíče a pak je odešle společně. Nespoléhej na to, že si to každý resolver ohlídá sám; jedno zapomenuté místo vrátí problém zpět a najdeš ho až v produkci pod zátěží.