Vzorek DataLoader pomáhá zmírnit problémy s `Whenloaded ()` v GraphQL tím, že se zabývá běžným problémem dotazu N+1 a optimalizací načítání dat prostřednictvím mechanismů dávkování a ukládání do mezipaměti.
Problémy s `whloaded ()` v GraphQL
V GraphQL musí resolvery často načíst související data pro více entit. Bez optimalizace to může vést k problému N+1, kde dotaz na položky n vede k dalším požadavkům na databázi (plus počáteční), což způsobuje významnou degradaci výkonu. Metoda `Whenloaded ()`, která čeká na načtení souvisejících dat, to může zhoršit spuštěním více samostatných načtení dat pro každou položku, což vede k neefektivním, opakujícím se dotazům databáze.
Jak vzorec dataloaderu pomáhá
1. požadavky na dávkování
Vzor datového nakládání dává více požadavků na jednotlivé údaje do jediného dotazu. Namísto načítání souvisejících dat jeden po druhém jako `whenloaded ()“ může udělat, DataLoader shromažďuje všechny klíče požadované během jediného klíště smyčky události a odešle jednu dávkovou požadavek do databáze. To drasticky snižuje počet dotazů a zlepšuje výkon. Například namísto 16 samostatných dotazů může dataloader snížit na 4 dávkové dotazy, přičemž každá načítá data pro více klíčů najednou [2] [6] [8].
2. výsledky ukládání do mezipaměti
DataLoader ukládá ukládání výsledků načtených dat v rámci jediného požadavku. Pokud jsou stejná data požadována několikrát během rozlišení dotazu GraphQL, DataLoader vrátí výsledek uloženého namísto opětovného dotazování databáze. Tato deduplikace zabraňuje nadbytečným požadavkům, že `, když je naloženo ()`, by jinak mohlo způsobit [1] [3] [6].
3. instance dataloaderu
Aby se zabránilo úniku dat a zajistilo správné ukládání do mezipaměti na kontext uživatele/požadavku, pro každý požadavek GraphQL je vytvořena nová instance Dataloader. Tento přístup udržuje izolaci a bezpečnost a zároveň těží z dávkování a ukládání do mezipaměti v rámci této žádosti [3].
4. Integrace s resolvery GraphQL
Integrací DataLoaderu do resolverů GraphQL každý resolver volá `load` na datopilant namísto přímého dotazování databáze nebo spoléhání na` whloaded () `. To přesouvá odpovědnost za efektivní přitahování dat do datového nakládku, který spravuje dávkování a ukládání do mezipaměti transparentně [1] [3] [6].
Shrnutí
Vzorek DataLoader efektivně zmírňuje neefektivnosti `whloaded ()` v Graphql od:
- Shromažďování více žádostí o načtení dat do dotazů na jednotlivé dávky, čímž se sníží počet zpátečních cest databáze.
- Ukládání do mezipaměti načtených dat, aby se zabránilo duplicitním dotazům v rámci stejného požadavku.
- Vytváření izolovaných instancí dataloader na žádost o udržení zabezpečení a správnosti.
- Zjednodušení kódu resolveru abstraktováním optimalizace načtení dat do Dataloader.
To má za následek výrazně zlepšený výkon, škálovatelnost a využití zdrojů v aplikacích GraphQL [2] [6] [7].
Citace:
[1] https://www.apollographql.com/tutorials/dataloaders-typescript/04-using-a-tataloader
[2] https://wundergraph.com/blog/dataloader_3_0_breadth_first_data_loading
[3] https://github.com/graphql/dataloader
[4] https://www.parabol.co/blog/graphql-dataloader-cookbook/
[5] https://swatinem.de/blog/graphql-dataloader-part2/
[6] https://moldstud.com/articles/p-solving-the-dataloader-pattern-in-graphql-development
[7] https://ariadnegraphql.org/docs/dataloaders
[8] https://www.apollographql.com/Tutorials/Dataloaders-DGS/03-data-loaders-Under-the- Hood