Otimizando o Controle de Acesso e Desempenho de Consulta GraphQL Detalhado

O GraphQL é tanto uma linguagem de consulta para APIs quanto um tempo de execução para executar essas consultas com seus dados existentes. Ele oferece uma descrição abrangente e clara dos dados disponíveis em sua API, permite que os clientes solicitem precisamente o que precisam sem excessos, facilita a evolução das APIs ao longo do tempo e suporta ferramentas de desenvolvedor robustas.

Controle de Acesso e Otimização de Consulta do GraphQL

Controle de Acesso

A autorização é um conjunto de regras ou lógica de negócios que determina se um usuário, sessão ou contexto possui a lista de controle de acesso (ACL) para executar determinadas ações ou visualizar dados específicos.

Esse comportamento deve ser aplicado na camada de lógica de negócios. Embora possa ser tentador colocar a lógica de autorização diretamente na camada do GraphQL, geralmente é mais apropriado lidar com isso em outro lugar.

Otimização de Consultas

Otimizar consultas do GraphQL envolve técnicas como minimizar a busca e processamento de dados desnecessários para melhorar os tempos de resposta e reduzir a carga no servidor. Isso resulta em um aplicativo mais eficiente, oferecendo uma melhor experiência ao usuário, aumento do engajamento e retenção do usuário e maior escalabilidade do servidor.

Formas de Otimizar Consultas do GraphQL 

  • N+1 (Carregamento em Lote) 
  • Over-Fetching e Under-Fetching
  • Armazenamento em Cache para Latência Reduzida
  • Paginação

Melhorando o Controle de Acesso do GraphQL e a Otimização de Consultas do GraphQL 

O mecanismo de autorização valida as permissões de nós e campos usando ACL (lista de controle de acesso) e otimiza as consultas GraphQL com base nas permissões. Além disso, o Resolutor N+1 melhora o desempenho ao consolidar consultas. Essa abordagem resolve o problema N+1.

Figure 1



Atores

  • Consulta GraphQL: Uma solicitação enviada por um cliente a um servidor GraphQL para buscar dados específicos.
  • Mecanismo GraphQL: Refere-se a um serviço que permite executar consultas GraphQL.
  • Mecanismo de Autorização: Valida as permissões de nós e campos usando ACL e otimiza a consulta GraphQL com base nas permissões dos campos.
  • Resolutor N+1: Reduz a sobrecarga e a latência associadas a múltiplas consultas de banco de dados, melhorando o desempenho e a eficiência.

Figure 2

Figure 3

Melhorando o Controle de Acesso

Implementação Existente

Vamos supor que um aplicativo tenha Produtos, Fornecedores e Endereços. Acessar dados de Fornecedores e Endereços requer autenticação do usuário, que pode ser facilmente gerenciada nos resolutores.

No entanto, os dados do Fornecedor são restritos aos usuários administradores, e alguns campos do fornecedor são acessíveis apenas para funções específicas. Por outro lado, os produtos são públicos e podem ser visualizados com a função de Proprietário do Produto. Executar a consulta mencionada (Figura 3) retornará os dados do produto juntamente com os dados do Fornecedor e do Endereço associados, o que leva a um problema de segurança.

Implementação Aprimorada

Os nós e campos da consulta são validados conforme a permissão do usuário, e a consulta otimizada do GraphQL é gerada.

Figure 3.1 (Flow Diagram)

 

Figure 4

A Figura 4 é um exemplo de como você pode implementar autenticação personalizada em uma API GraphQL usando Node.js. Neste código, a função é extraída do cabeçalho de Autorização e então utilizada, junto com a consulta, para validar a autorização.

Figure 5

Neste exemplo, estamos utilizando a função e permissão de um usuário da sessão ou requisição que controla o acesso a consultas e mutações específicas no esquema do GraphQL. Definimos as regras de função e permissão no esquema do GraphQL para todos os usuários.

Este método verifica recursivamente a função e permissão em todos os nós e campos. Se um nó ou campo não for permitido, então ele realiza uma das seguintes ações com base na configuração:

  • Remover nó ou campo.
  • Retornar campo ou nó com uma mensagem de erro.
  • Lançar exceção.

Uma vez que a consulta do GraphQL é validada em relação ao esquema, este método retornará a consulta otimizada do GraphQL.

Aprimorando a Otimização da Consulta ORM Usando N+1

Implementação Existente

É uma questão técnica que impacta o desempenho de uma consulta. Pode ocorrer em aplicativos que usam um framework de Mapeamento Objeto-Relacional (ORM) para acessar um banco de dados.Normalmente surge quando o aplicativo precisa carregar uma coleção de entidades relacionadas do banco de dados.

Vamos supor que existam 2 produtos; é necessário fazer 1 consulta para recuperar os produtos e mais 2 consultas adicionais para buscar os fornecedores de cada produto individualmente.

Uma consulta recupera a lista de produtos e uma consulta separada busca os fornecedores para cada produto. O número de consultas de fornecedores é igual ao número de produtos.

Figure 6

Figure 7

Implementação Aprimorada

Ao atingir o resolvedor N+1, o resolvedor N+1 otimiza as consultas para minimizar o número de solicitações ao banco de dados, reduzindo-as para uma única consulta para os dados principais e uma consulta adicional para os dados relacionados, mitigando efetivamente o problema N+1.

  1. Consulta de Dados Principais: Uma única consulta que recupera o conjunto principal de dados necessário para o aplicativo.
  2. Consulta de Dados Relacionados: Uma consulta adicional buscando quaisquer dados relacionados necessários para completar o conjunto de dados.

Figure 8

Figure 9: Total No. of Queries are 2 (1 for Product, 1 for Vendor)

Figure 10

Depois que todos os resolvedores de consulta forem concluídos, o servidor retorna os dados otimizados para o cliente em formato JSON.

Conclusão

Nós destacamos que a implementação de mecanismos de autorização detalhados, juntamente com medidas de segurança aprimoradas, é crucial para garantir a segurança de uma API GraphQL. Isso inclui segurança em nível de nó e em nível de campo.

Conforme este artigo descreve, o problema N+1 ocorre quando uma consulta não otimizada gera chamadas excessivas ao banco de dados em GraphQL. Nós fornecemos uma solução para superar o problema N+1. Isso reduz o uso de recursos do servidor de banco de dados, resultando em economia de custos e melhor escalabilidade. Além disso, ao aprimorar o desempenho da consulta, isso melhora a experiência do usuário ao reduzir os tempos de resposta da consulta.

Source:
https://dzone.com/articles/optimizing-fine-grained-graphql-access-control-and-queries