Otimizando o Controle de Acesso Granular do GraphQL e o Desempenho de Consultas

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

Controle de Acesso e Otimização de Consultas GraphQL

Controle de Acesso

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 realizar certas 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 de GraphQL, geralmente é mais apropriado lidar com ela em outro lugar.

Otimização de Consultas

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

Formas de Otimizar Consultas GraphQL

  • N+1 (Carregamento em Lote)
  • Sobrecarga e Subcarga de Dados
  • Caching para Redução de Latência
  • Paginação

Enhancing GraphQL Access Control and GraphQL Query Optimization 

Motor de Autorização valida permissões de nós e campos usando ACL (lista de controle de acesso) e otimiza consultas GraphQL com base nas permissões. Além disso, oResolvedor N+1 melhora o desempenho ao consolidar consultas. Esta 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.
  • Motor GraphQL: Refere-se a um serviço que permite executar consultas GraphQL.
  • Motor de Autorização: Valida as permissões de nós e campos usando ACL e otimiza a consulta GraphQL com base nas permissões de campos.
  • Resolvedor N+1: Reduz a sobrecarga e a latência associadas a múltiplas consultas ao 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 Fornecedor e Endereço requer autenticação do usuário, o que pode ser facilmente tratado nos resolvedores.

No entanto, os dados do Fornecedor são restritos a usuários administradores, e alguns campos do fornecedor são acessíveis apenas a papéis específicos. Por outro lado, os produtos são públicos e podem ser visualizados com o papel de Proprietário do Produto. Executar a consulta mencionada (Figura 3) retornará dados do produto juntamente com os dados associados do Fornecedor e Endereço, levando a uma questão de segurança.

Implementação Aprimorada

O nó e os campos da consulta são validados conforme a permissão do usuário, e uma consulta GraphQL otimizada é 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, em seguida, usada, juntamente com a consulta, para validar a autorização.

Figure 5

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

Este método verifica recursivamente o papel e a permissão em todos os nós e campos. Se um nó ou campo não for permitido, 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 GraphQL seja validada contra o esquema, este método retornará a consulta GraphQL otimizada.

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

Implementação Existente

É uma questão técnica que afeta o desempenho de uma consulta. Pode ocorrer em aplicações que utilizam uma estrutura de Mapeamento Objeto-Relacional (ORM) para acessar um banco de dados.

Normalmente surge quando a aplicação precisa carregar uma coleção de entidades relacionadas do banco de dados.

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

Figure 6

Figure 7

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.

Implementação Aprimorada

Uma vez que a solicitação atinge 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 a uma única consulta para os dados principais e uma consulta adicional para os dados relacionados, efetivamente mitigando o problema N+1.

  1. Consulta de Dados Principais: Uma única consulta que recupera o conjunto principal de dados necessário para a aplicação.
  2. Consulta de Dados Relacionados: Uma consulta adicional que busca 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

Após a conclusão de todos os resolvedores de consulta, o servidor retorna os dados otimizados para o cliente em formato JSON.

Conclusão

Nós delineamos que a implementação de mecanismos de autorização granular, juntamente com medidas de segurança aprimoradas, é crucial para proteger uma API GraphQL. Isso inclui tanto a segurança no nível do nó quanto no nível do campo.

Como este artigo descreve, o problema N+1 ocorre quando uma consulta não otimizada leva a chamadas excessivas ao banco de dados no GraphQL. Nós fornecemos uma solução para superar o problema N+1. Isso diminui 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, reduzindo os tempos de resposta das consultas.

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