Pular para o conteúdo

Voltar para o blog

API

REST vs GraphQL: o custo real de cada um

· 7 min

O debate REST vs GraphQL costuma girar em torno de ergonomia pro desenvolvedor, mas as trocas de performance dos dois lados são concretas e frequentemente subestimadas.

Ilustração de uma árvore de nós conectados

O problema que o GraphQL realmente resolve

REST sofre de over-fetching e under-fetching: formatos de resposta fixos por endpoint forçam o cliente ou a receber campos que não usa, ou a fazer várias idas e vindas pra montar o que precisa. GraphQL resolve exatamente isso, deixando o cliente escolher os campos por requisição.

O preço: N+1 controlado pelo cliente

Uma query GraphQL pode pedir relações aninhadas em qualquer profundidade, e a menos que os resolvers do servidor façam batching (como com DataLoader), cada campo aninhado pode disparar uma query por item do nível acima, o mesmo N+1 que ORMs já sofrem, só que agora o formato da consulta (e portanto qual fanout ela dispara) é decidido pelo cliente a cada requisição, muito mais difícil de prever e cachear do lado do servidor.

Cache HTTP fica mais difícil

REST se apoia em cache de HTTP (GET + URL como chave de cache, amigável a CDN) que não se traduz direto pro GraphQL, já que a maior parte do tráfego GraphQL é POST com corpo de query. Cachear exige ou queries persistidas, ou um cache de aplicação com chave composta pela query resolvida mais as variáveis.

Como equilibrar isso na prática

O custo do GraphQL é administrável com batching de resolvers, limites de profundidade/complexidade de query pra barrar consultas aninhadas patológicas, e queries persistidas pra recuperar cacheabilidade, mas nada disso é de graça, é trabalho de engenharia que REST não exige por padrão.