DEV Community

Kaue Campos
Kaue Campos

Posted on

Do Monólito ao Supergraph: Como o GraphQL Federation Escala Microservices

Recentemente, um novo desafio profissional me tirou da zona de conforto e me colocou diante de um problema que não era apenas técnico, mas estrutural: como escalar uma API GraphQL em um ambiente com múltiplos times, múltiplos domínios e deploys independentes.

Eu já conhecia o GraphQL, mas foi ao mergulhar em Federation que comecei a enxergar a diferença entre resolver o problema do cliente e resolver o problema da organização.

Este artigo não é sobre como usar GraphQL. É sobre o que acontece quando ele cresce demais.

O que é GraphQL (e por que ele foi revolucionário)

Criado pelo Facebook (hoje Meta) em 2015, o GraphQL surgiu para resolver limitações práticas das APIs REST:

  • Overfetching
  • Underfetching
  • Multiplicidade de endpoints
  • Evolução difícil de contrato

O diferencial do GraphQL é simples e poderoso: o cliente define exatamente os dados que precisa, em uma única requisição, com um schema fortemente tipado servindo como contrato.

Isso trouxe ganhos reais:

  • Redução de payload
  • Flexibilidade para múltiplos clientes (web, mobile, IoT)
  • Evolução incremental de schema
  • Documentação automática via introspection

Em projetos pequenos ou médios, um único servidor GraphQL central funciona muito bem.

O problema começa quando a empresa cresce.

O Limite do GraphQL Centralizado

GraphQL resolve o problema da comunicação cliente-servidor, mas ele não resolve automaticamente o problema organizacional.

Quando múltiplos times começam a alterar o mesmo schema, surgem sintomas claros.

1. Gargalo de Deploy

Em um schema centralizado:

  • Todos os domínios vivem no mesmo repositório.
  • Alterações geram conflitos frequentes.
  • Pull requests começam a se bloquear.
  • O pipeline de CI/CD vira gargalo compartilhado.

O efeito colateral é sutil, mas perigoso:

times passam a coordenar releases por causa da API.

Isso reduz autonomia e desacelera evolução.

2. Propriedade Indefinida do Schema

Quem é dono do tipo User?

  • Se Pagamentos adiciona um campo que quebra Usuários, quem corrige?
  • Se Crédito precisa alterar uma entidade base, precisa negociar com quantos times?

Sem ownership claro, o schema vira um território compartilhado sem fronteiras.

E territórios sem fronteiras geram conflitos.

3. Monólito de API (Mesmo com Microserviços)

Esse é um erro comum.

Você tem microserviços separados, mas cria um único servidor GraphQL que:

  • Conhece todos os bancos
  • Orquestra regras de negócio cruzadas
  • Acessa múltiplos domínios diretamente

Na prática, você criou um monólito de API em cima de microserviços.

A complexidade volta a se concentrar em um único ponto.

4. Problemas de Versionamento de Schema

Em um schema único:

  • Breaking changes exigem coordenação global.
  • Depreciações demoram meses.
  • Não existe versionamento isolado por domínio.

Qualquer alteração estrutural passa a ser um evento organizacional.

Isso não escala.

O que é GraphQL Federation?

A Federation foi popularizada pelo ecossistema Apollo como uma forma de dividir o schema em partes independentes chamadas subgraphs.

Cada subgraph:

  • Possui seu próprio schema
  • Possui seu próprio ciclo de deploy
  • É responsável pelo seu domínio

O gateway compõe esses schemas em um supergraph único.

O ponto central da Federation não é dividir arquivos.

É distribuir responsabilidade.

Imagine três domínios:

  • Contas
  • Transações
  • Crédito

O serviço de Contas define:

type User @key(fields: "id") {
id: ID!
name: String
balance: Float
}
Enter fullscreen mode Exit fullscreen mode

O serviço de Crédito pode estender esse tipo:

extend type User @key(fields: "id") {
  id: ID! @external
  creditLimit: Float
}
Enter fullscreen mode Exit fullscreen mode

O domínio de Crédito não precisa que Contas conheça seu modelo interno.
A dependência é declarativa e contratual.

Isso reduz acoplamento estrutural entre domínios.

Gateway vs Router: Uma Distinção Importante

Quando falamos em Federation, precisamos diferenciar duas implementações principais.

Apollo Gateway

  • Implementado em Node.js
  • Baseado em JavaScript
  • Primeira geração de runtime federado
  • Alta flexibilidade e fácil customização

Ele foi essencial para popularizar Federation.

Porém, possui limitações naturais do ambiente Node:

  • Event loop único
  • Garbage collection impactando latência
  • Maior consumo de memória sob alta carga
  • Performance limitada em cenários de alta concorrência

Para cargas moderadas, funciona bem.

Para escala massiva, começa a mostrar limites.

Apollo Router

O Apollo Router é uma reescrita completa em Rust.

Características técnicas relevantes:

  • Compilado (não interpretado)
  • Sem garbage collector
  • Controle fino de concorrência
  • Arquitetura orientada a streaming
  • Melhor paralelização de chamadas a subgraphs

Na prática, isso significa:

  • Latência menor (principalmente P95/P99)
  • Melhor throughput
  • Uso mais eficiente de CPU
  • Menor consumo de memória

Em arquiteturas distribuídas, o gateway é o ponto mais crítico do sistema.

Ele está em todas as requisições.

Se ele degrada, todo o sistema degrada.

Por isso o Router se tornou a escolha padrão em ambientes de alta escala.

Query Planning: O Cérebro do Supergraph

O gateway não apenas encaminha requisições.

Ele constrói um plano de execução (query plan):

  • Analisa a query do cliente
  • Determina quais campos pertencem a cada subgraph
  • Resolve dependências entre entidades
  • Executa chamadas em paralelo sempre que possível

Esse planejamento é essencial para minimizar latência e reduzir chamadas desnecessárias entre serviços.

A eficiência do query planner é um dos fatores que diferencia implementações de gateway.


Acoplamento Entre Domínios

Sem Federation, domínios começam a vazar entre si:

  • Crédito acessa diretamente o banco de Usuário
  • Pagamentos depende de estrutura interna de Contas
  • Resolvers centrais começam a concentrar lógica cruzada

Isso gera:

  • Dependências circulares
  • Dificuldade de refatoração
  • Aumento da complexidade cognitiva

Federation força disciplina arquitetural:

  • Cada domínio é responsável por seus dados
  • Extensões são explícitas
  • O contrato é validado na composição do supergraph

O acoplamento deixa de ser implícito e passa a ser formalizado.

Em resumo:

  • GraphQL resolve o problema do cliente.
  • Federation resolve o problema da organização.
  • E o Router resolve o problema da escala.

Quando a API começa a refletir a estrutura da empresa, a arquitetura precisa evoluir junto. Federation não é apenas uma técnica de composição de schema. É um modelo arquitetural que permite autonomia, governança e escalabilidade organizacional.

O supergraph não é apenas uma evolução técnica, ele é um reflexo da maturidade do sistema e da organização que o construiu.

Top comments (1)

Collapse
 
porteralvaro profile image
Alvaro Nunes

Trabalho incrivel !! Parabens Kaue !