O padrão de Dataloader ajuda a mitigar problemas com `quando carregados ()` no GraphQL, abordando o problema de consulta N+1 comum e otimizando os dados que buscam mecanismos de lote e cache.
Problemas com `quando carregado ()` em grafql
No GraphQL, os resolvedores geralmente precisam buscar dados relacionados para várias entidades. Sem otimização, isso pode levar ao problema N+1, onde uma consulta para n itens resulta em N solicitações adicionais de banco de dados (mais a inicial), causando uma degradação significativa do desempenho. O método `when whenLoaded ()`, que aguarda a carga de dados relacionados, pode exacerbar isso, acionando várias buscas de dados separadas para cada item, levando a consultas ineficientes e repetitivas de banco de dados.
como o padrão de dataloader ajuda
1. Solicitações em lote
O padrão Dataloader em lote várias solicitações de dados individuais em uma única consulta. Em vez de buscar dados relacionados um por um como `quando carregado ()` pode ser, o Dataloader coleta todas as chaves solicitadas durante um único tick do loop do evento e envia uma solicitação em lote para o banco de dados. Isso reduz drasticamente o número de consultas, melhorando o desempenho. Por exemplo, em vez de 16 consultas separadas, o Dataloader pode reduzi -lo para 4 consultas em lotes, cada um dos dados buscando várias chaves de uma só vez [2] [6] [8].
2. Resultados do cache
Dataloader cache os resultados dos dados buscados no escopo de uma única solicitação. Se os mesmos dados forem solicitados várias vezes durante a resolução de uma consulta grafql, o Dataloader retornará o resultado em cache em vez de consultar o banco de dados novamente. Essa desduplicação impede solicitações redundantes que `quando carregadas ()` poderiam causar [1] [3] [6].
3. Instâncias de Dataloader por solicitação por solicitação
Para evitar vazamentos de dados e garantir o cache correto por contexto de usuário/solicitação, uma nova instância do Dataloader é criada para cada solicitação grafql. Essa abordagem mantém o isolamento e a segurança, enquanto ainda se beneficia de lotes e cache nessa solicitação [3].
4. Integração com resolvedores grafql
Ao integrar o Dataloader aos resolvedores do GraphQL, cada resolvedor chama `load` no Dataloader em vez de consultar diretamente o banco de dados ou confiar em` whenloaded () `. Isso muda a responsabilidade de obter dados eficientes que buscam para o Dataloader, que gerencia lotes e cache de forma transparente [1] [3] [6].
Resumo
O padrão Dataloader mitiga efetivamente as ineficiências de `quando carregado ()` em grafql por:
- Coletando várias solicitações de busca de dados em consultas de lote único, reduzindo o número de ida e volta do banco de dados.
- O cache buscou dados para evitar consultas duplicadas dentro da mesma solicitação.
- Criando instâncias isoladas de Dataloader por solicitação para manter a segurança e a correção.
- Simplificando o código do resolver, abstraindo os dados buscando otimização no Dataloader.
Isso resulta em desempenho significativamente melhorado, escalabilidade e utilização de recursos em aplicativos GraphQL [2] [6] [7].
Citações:
[1] https://www.apollographql.com/tutorials/dataloaders-typescript/04-using-dataloader
[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