5 situací, kdy se REST API a GraphQL chovají odlišně

Aus Rettungsdienst-Wiki
Zur Navigation springen Zur Suche springen

Optimalizace není jednorázový úkon. Dotazy, které byly rychlé, mohou po nárůstu dat zpomalit. Proto se vyplatí mít přehled o pomalých dotazech a čas od času zkontrolovat jejich plány. Zaměřte se na ty, které běží často, i když jsou na první pohled rychlé – jejich kumulativní dopad bývá větší než u jednoho dlouhého dotazu. Změna jedné podmínky nebo přidání jednoho vhodného indexu pak často znamená rozdíl mezi dotazem, který zatěžuje celý systém, a dotazem, který si vezme jen to, co potřebuje.

U GraphQL si dejte pozor na N+1 problém. Každé pole může spustit samostatný dotaz do databáze. Řešením je batchování a cache, ale to není automatické. REST tomuto problému často uniká tím, že jeden endpoint vrátí data z jedné nebo několika málo tabulek. Další častá chyba je ignorování hloubky dotazu. GraphQL umožňuje rekurzivní zanořování a útočník může poslat dotaz, který zbytečně zatíží server. Nastavte limit hloubky a složitosti dotazu.

Opakovaný požadavek je v REST API běžná věc. Klient odešle požadavek, nedostane včas odpověď, a tak ho pošle znovu. Pokud server nerozliší, že jde o tentýž záměr, může vytvořit dvě objednávky, dva uživatele nebo dvakrát odečíst z účtu. Idempotence znamená, že provedení stejné operace vícekrát má stejný výsledek jako provedení jednou. U GET, PUT a DELETE je to přirozené, u POST ne. Právě tam vzniká většina problémů.

Další častá chyba je testování přes reálný plánovač. Ten spouští úlohy v intervalech, které se do testu nevejdou. Místo čekání na tik hodin použijte možnost úlohu spustit ručně nebo plánovač v testovacím režimu obejít. Ověřujete logiku zpracování, ne to, že knihovna pro plánování funguje. Stejně tak nechte stranou síťová volání – nahraďte je zástupnými objekty, jinak budou testy pomalé a nestabilní.

Nakonec se rozhodujte podle týmu a ekosystému. Pokud máte tým zvyklý na REST, knihovny a monitoring, přechod na GraphQL znamená učení a nové nástroje. Pokud stavíte klienta, který potřebuje rychle měnit pohledy na data, GraphQL může ušetřit spoustu práce. Často dává smysl kombinace: REST pro jednoduché a stabilní operace, GraphQL pro složité čtení. Vyberte podle konkrétních dotazů, ne podle toho, co je zrovna moderní.

Index není všelék. Pomáhá, když filtrujete podle sloupce s vysokou selektivitou, tedy když podmínka vybere malou část tabulky. Naopak index na sloupci, kde platí podmínka pro většinu řádků, práci spíš zpomalí, protože databáze musí číst index i samotná data. Pozor také na to, jak jsou sloupce v indexu seřazené. U složeného indexu platí, že první sloupec musí být v dotazu použit, jinak se zbytek indexu často neuplatní. Pokud často vyhledáváte podle dvou sloupců, nestačí dva samostatné indexy – složený index může být výrazně efektivnější.

Začít přispívat do open source projektu bývá nejtěžší na psychice, ne na technice. Většina lidí stráví týdny čtením kódu a hledáním „dokonalého" úkolu, místo aby udělali malou změnu. Praxe je přitom mnohem přímočařejší: vyberte projekt, který sami používáte, a podívejte se, co vás na něm štve. Možná chybí čárka v dokumentaci, možná spadne test na okrajovém případu. Přesně tam začněte.

Malá změna, jasný popis, trpělivost První příspěvek držte co nejmenší. Oprava překlepu v komentáři nebo doplnění chybějícího testu má větší šanci projít než rozsáhlý refaktoring. Do popisu změny napište, co a proč měníte, a připojte odkaz na související hlášení o chybě, pokud existuje. Vyhněte se mixování několika nesouvisejících úprav v jednom návrhu – to je nejčastější důvod, proč správci změnu vrátí k přepracování. Formátování, mezery a styl odsazení držte shodné s okolním kódem.

Po přijetí změny se nebojte ptát, co dál. Většina projektů vede seznam úkolů vhodných pro nováčky. Přispívání je dovednost jako každá jiná – první krok je nejtěžší, druhý už jde snáz. Vytrvejte u jednoho projektu alespoň několik měsíců. Naučíte se jeho architekturu, získáte důvěru správců a příště už budete řešit zajímavější problémy než překlepy.

Typické chyby, které potkáte: příliš velký první návrh, chybějící testy, nerespektování konvencí projektu a ignorování automatických kontrol. Tyto kontroly často spouštějí testy a analýzu stylu ještě před lidskou recenzí. Když selžou, opravte je a nahrajte novou verzi. Nikdy nemažte komentáře recenzentů ani historii větve účelovými přepisy, pokud vás k tomu projekt výslovně nevyzve.

Akce navrhujte jako malé, konkrétní události, ne jako univerzální příkazy. Místo jedné akce UPDATE s obřím payloadem použijte itemAdded, itemRemoved a itemUpdated. Reducer pak zůstane čitelný a testovatelný. U složitějšího stavu se osvědčil vzor slice: jeden soubor obsahuje počáteční stav, akce i reducer pro jednu doménu. Nesnažte se ale vytvořit jeden slice pro celou aplikaci, jinak se vrátíte k monolitickému reduceru, kterému nikdo nerozumí.