Když historická budova ožívá, vybavte penzion bez chyb
Druhým signálem je zvuk motoru. Když se ozve klepání, dunění nebo chrastění, které předtím nebylo slyšet, olej už nedrží film mezi kovovými díly. Pozor na to zejména po studeném startu – pokud zvuk po zahřátí nezmizí, nejezděte dál. Třetím signálem je kouř z výfuku. Modrý dým znamená, že motor spaluje olej, obvykle kvůli opotřebeným pístním kroužkům nebo těsněním ventilů. Po výměně oleje kouř na chvíli zmizí, ale pokud se vrátí během několika stovek kilometrů, problém není v oleji, ale v mechanice.
Během léčby je potřeba upravit jídelníček. Vyhněte se tvrdým potravinám, které mohou zámečky odlomit – oříšky, tvrdé pečivo, syrová mrkev, kosti. Keramika je křehčí než kov, takže i kousnutí do jablka může znamenat návštěvu ordinace. Potraviny nakrájejte na menší kousky a kousejte zadními zuby. Pozor také na lepivé věci: karamely, žvýkačky a tuhé bonbony se lepí na drát a nejdou dobře odstranit.
Typické chyby: výměna veškeré vody, mytí filtru pod tekoucí vodou, přikrmování, nasazení nových ryb bez karantény a ignorování prvních příznaků. Když ryba onemocní, izolujte ji, zkontrolujte parametry vody a teprve pak zvažte léčbu. Nepřidávejte léky plošně do celého akvária bez rozmyslu — poškodí to biologickou rovnováhu a oslabí i zdravé ryby.
Nezapomínejte měřit. Sledujte latenci jednotlivých resolverů, počet databázových dotazů na jeden požadavek a podíl dotazů, které narazí na limit komplexity. Bez těchto čísel se optimalizace zvrhne v hádání. A ještě jedna věc: sledujte, jak se chová schéma při změnách. Přidání pole, které vypadá nevinně, dokáže zdvojnásobit náklady existujících dotazů, pokud se dotýká stejné datové vrstvy.
Ke zrychlení patří i správné cachování na úrovni resolverů, ne jen na úrovni HTTP. Data, která se v rámci jednoho požadavku čtou vícekrát, mají zůstat v paměti po dobu jeho zpracování. Naopak výsledky závislé na uživateli nepatří do sdílené cache bez rozlišení kontextu. Typickou chybou je cachovat agregační pole bez ohledu na vstupní argumenty – výsledky se pak míchají mezi různými filtry a klient dostane nesprávná data.
4. Spáry dělané na sucho a bez správného tmelu Sádrokarton v podkroví se nesmí klást natěsno na sebe. Mezi deskami má být mezera a ta se vyplňuje tmelem, do kterého se vkládá výztužná páska. Tmel musí být pružný, ne tvrdý. Kdo spoje jen zamázne a přetře, ten je za rok uvidí znovu jako prasklinu. Stejně důležité je tmelení přes rohy šikmin, kde se stýkají dvě roviny. Tady se vyplácí použít rohový profil nebo pásku do vnitřního rohu.
Historická budova má vlastní pravidla. Než začnete nakupovat nábytek, projděte si stavebně-technický stav: vlhkost zdiva, stav oken, rozvody elektřiny a odpadů. U památkově chráněných objektů si dopředu ověřte, co vám dovolí příslušný úřad. Jakýkoli zásah do fasády, oken nebo kleneb může vyžadovat souhlas, a to i v interiéru. Typická chyba je koupit vybavení dřív než stavební povolení – pak se buď mění projekt, nebo nábytek skončí ve skladu.
Hloubka, komplexita a limity, které se nesmí podcenit Veřejné GraphQL API musí mít nastavené limity. Počítejte hloubku vnoření, počet polí a celkovou komplexitu dotazu ještě před jeho spuštěním. Dotaz, který projde validací, ale rekurzivně prochází celý graf, umí položit server spolehlivě. Komplexitní skóre se nastavuje podle nákladů jednotlivých polí a překročení se odmítá chybou. Stejně důležité je omezit velikost stránky u seznamů – bez výchozího a maximálního limitu si klient snadno vyžádá celou tabulku.
Většina týmů začne s GraphQL jako s jednoduchou náhradou RESTu. Schéma roste, klient si řekne o přesně ta pole, která potřebuje, a zdánlivě není co řešit. Jenže po pár měsících produkce se objeví dotazy, které trvají stovky milisekund, databáze je přetížená a server tráví většinu času rozbalováním vnořených objektů. Problém nebývá v GraphQL samotném, ale v tom, jak se resolvery a datové vrstvy poskládaly dohromady.
Persisted queries a automatické doplňování dovolují posílat místo celého dokumentu jen jeho hash. Server tak předem ví, jaký dotaz poběží, může ho předzpracovat a odmítnout neznámé varianty. To snižuje režii na parsování, omezuje prostor pro zneužití a zároveň zjednodušuje cache. Pokud persisted queries nezavedete, alespoň normalizujte dotazy a sledujte, které tvary se v produkci opakují.
Základním pravidlem je vyhnout se N+1 dotazům. Jakmile resolver pro pole vrací data pro každý prvek seznamu zvlášť, počet dotazů do databáze roste lineárně s velikostí výsledku. Řešením je dávkování a cachování – typicky přes DataLoader nebo obdobný mechanismus, který sesbírá klíče z jednoho tiku event loopu, provede jeden dotaz s podmínkou IN a výsledky rozdělí zpět. Bez tohoto kroku nemá smysl řešit cokoli dalšího.