En aquest tema, explorarem diverses estratègies per recuperar dades en una aplicació GraphQL. La manera com recuperem les dades pot tenir un impacte significatiu en el rendiment i l'eficiència de la nostra aplicació. Aprendrem a utilitzar diferents tècniques per optimitzar la recuperació de dades i assegurar-nos que les nostres consultes siguin eficients.
Objectius d'aprenentatge
- Comprendre les diferents estratègies de recuperació de dades.
- Aprendre a implementar aquestes estratègies en un servidor GraphQL.
- Optimitzar les consultes per millorar el rendiment.
Estratègies de recuperació de dades
- Recuperació directa
La recuperació directa és la manera més senzilla de recuperar dades. Consisteix a fer una consulta directa a la base de dades per obtenir les dades necessàries.
Exemple
const resolvers = { Query: { user: async (_, { id }, { dataSources }) => { return dataSources.userAPI.getUserById(id); }, }, };
En aquest exemple, getUserById
és una funció que fa una consulta directa a la base de dades per obtenir un usuari pel seu ID.
- Recuperació amb DataLoader
DataLoader és una eina que permet agrupar i emmagatzemar en memòria cau les consultes a la base de dades per millorar el rendiment. És especialment útil per evitar la recuperació redundant de dades.
Exemple
const DataLoader = require('dataloader'); const userLoader = new DataLoader(async (keys) => { const users = await getUsersByIds(keys); return keys.map((key) => users.find((user) => user.id === key)); }); const resolvers = { Query: { user: async (_, { id }) => { return userLoader.load(id); }, }, };
En aquest exemple, userLoader
agrupa les consultes per ID i les resol en una sola consulta a la base de dades.
- Recuperació amb paginació
La paginació és una tècnica per dividir les dades en pàgines més petites, la qual cosa permet recuperar només una part de les dades en cada consulta. Això és útil per gestionar grans volums de dades.
Exemple
const resolvers = { Query: { users: async (_, { page, limit }, { dataSources }) => { const offset = (page - 1) * limit; return dataSources.userAPI.getUsers({ offset, limit }); }, }, };
En aquest exemple, getUsers
recupera un conjunt de dades limitat basat en la pàgina i el límit especificats.
- Recuperació amb filtratge
El filtratge permet recuperar només les dades que compleixen certs criteris. Això pot reduir la quantitat de dades recuperades i millorar el rendiment.
Exemple
const resolvers = { Query: { users: async (_, { filter }, { dataSources }) => { return dataSources.userAPI.getUsersByFilter(filter); }, }, };
En aquest exemple, getUsersByFilter
recupera només els usuaris que compleixen els criteris de filtratge especificats.
- Recuperació amb emmagatzematge en memòria cau
L'emmagatzematge en memòria cau permet guardar les dades recuperades per evitar consultes repetides a la base de dades. Això pot millorar significativament el rendiment.
Exemple
const cache = new Map(); const resolvers = { Query: { user: async (_, { id }, { dataSources }) => { if (cache.has(id)) { return cache.get(id); } const user = await dataSources.userAPI.getUserById(id); cache.set(id, user); return user; }, }, };
En aquest exemple, les dades de l'usuari es guarden en memòria cau després de la primera consulta, evitant consultes repetides a la base de dades.
Exercicis pràctics
Exercici 1: Implementar DataLoader
Implementa DataLoader per agrupar les consultes d'usuaris en una sola consulta a la base de dades.
Solució
const DataLoader = require('dataloader'); const userLoader = new DataLoader(async (keys) => { const users = await getUsersByIds(keys); return keys.map((key) => users.find((user) => user.id === key)); }); const resolvers = { Query: { user: async (_, { id }) => { return userLoader.load(id); }, }, };
Exercici 2: Implementar paginació
Implementa la paginació per recuperar usuaris en pàgines de 10 elements.
Solució
const resolvers = { Query: { users: async (_, { page = 1, limit = 10 }, { dataSources }) => { const offset = (page - 1) * limit; return dataSources.userAPI.getUsers({ offset, limit }); }, }, };
Resum
En aquesta secció, hem après diverses estratègies per recuperar dades en una aplicació GraphQL, incloent la recuperació directa, l'ús de DataLoader, la paginació, el filtratge i l'emmagatzematge en memòria cau. Aquestes tècniques ens ajuden a optimitzar les nostres consultes i millorar el rendiment de la nostra aplicació.
Curs de GraphQL
Mòdul 1: Introducció a GraphQL
- Què és GraphQL?
- GraphQL vs REST
- Configuració d'un servidor GraphQL
- Conceptes bàsics de l'esquema de GraphQL
Mòdul 2: Conceptes bàsics
Mòdul 3: Disseny avançat d'esquemes
Mòdul 4: Treballant amb dades
- Connexió a una base de dades
- Estratègies de recuperació de dades
- Agrupació i emmagatzematge en memòria cau
- Gestió d'errors
Mòdul 5: Rendiment i seguretat
Mòdul 6: Eines i ecosistema
Mòdul 7: Proves i desplegament
- Proves unitàries de resolvers
- Proves d'integració
- Integració contínua
- Desplegament de servidors GraphQL