6 respostas
Execute ambas as APIs em paralelo por um tempo - mantenha o REST funcionando exatamente como está enquanto você lança o GraphQL como um novo endpoint. Dê tempo aos clientes para migrar no próprio ritmo, talvez um ano ou mais dependendo de quantos estão usando você. Documente bem o lado do GraphQL para que a migração pareça fácil, não forçada. Uma vez que a maioria tenha migrado, você pode descontinuar o REST gradualmente com bastante aviso.
Rodar os dois em paralelo funciona, mas o verdadeiro ponto de dor que ninguém menciona é que você vai precisar manter sua camada de banco de dados e lógica de negócio sincronizadas entre duas formas de query diferentes - um time inevitavelmente acaba otimizando para GraphQL enquanto clientes REST começam a bater no mesmo backend e se perguntam por que estão tendo timeouts. Uma abordagem mais limpa é construir GraphQL em cima dos seus endpoints REST existentes como uma camada adaptadora primeiro, então você na verdade não está mantendo dois caminhos de código separados, só uma camada de tradução que prova que o schema funciona antes de você tocar no backend em si.
A abordagem de API dupla faz sentido, mas aqui está o que geralmente é pulado: versione seus endpoints REST explicitamente (como `/api/v1/`) antes mesmo de introduzir GraphQL. Isso dá uma separação limpa e significa que quando você eventualmente descontinuar REST, não está tirando o tapete de ninguém que ainda está usando. Eles podem ficar na v1 para sempre se precisarem, e você tem um caminho de descontinuação claro documentado desde o dia um.
O problema de sincronização que foi mencionado é real e doloroso. O que ajuda é depender bastante de adaptadores internos ou de uma camada de abstração de consultas - basicamente um meio termo que tanto REST quanto GraphQL podem usar, então sua lógica de negócio permanece DRY. Se você constrói resolvers GraphQL que apenas traduzem para as mesmas chamadas de serviço subjacentes que seus controladores REST, você reduz a chance deles divergirem e servirem dados diferentes. É um pouco mais trabalho no início, mas te poupa de debugar "por que esse campo tem valores diferentes no GraphQL vs REST" seis meses depois.
Também vale a pena pensar: quais clientes importam mais? Se você tem 100 serviços internos usando sua API REST vs um punhado de consumidores públicos, sua linha do tempo de migração e estratégia de comunicação devem ser totalmente diferentes. Times internos podem se mover mais rápido, e você pode realmente forçar a migração. Usuários externos precisam de muito mais aviso e paciência.
o problema maior que as pessoas ignoram é que você acaba mantendo duas documentações totalmente separadas, SDKs e fluxos de autenticação se não tiver cuidado - o que significa que seu time de suporte fica sobrecarregado com perguntas sobre qual API usar, e os desenvolvedores escolhem a errada. antes de lançar GraphQL, deixe bem claro por quanto tempo REST vai ficar suportada (tipo 18 meses com data de encerramento fixa) e comunique isso o tempo todo, porque ambiguidade é o que mata essas migrações. você está planejando manter paridade de funcionalidades entre as duas APIs durante a transição, ou GraphQL vai ganhar novas funcionalidades primeiro para incentivar a mudança?
Não tente fazer seus schemas de REST e GraphQL se espelharem perfeitamente um no outro - é isso que confunde as pessoas. Mantenha-os intencionalmente soltos para que o GraphQL possa reformular as queries do jeito que fizer sentido para os clientes, enquanto sua camada REST permanece estável; sincronize no nível da camada de dados, não no contrato da API, e você evita a maioria do pesadelo de manutenção que vem de tentar manter duas interfaces idênticas.
Não tente trocar REST da noite para o dia ou fazer algum tipo de deprecação gradual onde você já está empurrando clientes para a nova coisa enquanto a antiga ainda existe - é aí que as coisas quebram, as pessoas ficam confusas sobre qual endpoint usar, e você acaba com um ecossistema fragmentado mesmo assim.
O caminho mais limpo é estabilizar sua API REST primeiro. Certifique-se de que está fazendo o que precisa fazer, documente adequadamente, e então adicione GraphQL como uma camada de serviço completamente separada em cima das mesmas fontes de dados. Isso significa que sua lógica de negócio e banco de dados não precisam saber sobre nenhum dos formatos de API - ambos estão apenas conversando com o mesmo sistema subjacente. Você não está duplicando código, está apenas adicionando outra forma de consultá-lo. Isso tira a pressão do problema de sincronização que aparece quando você está tentando manter dois padrões de consulta diferentes em sincronia.
Estabeleça um cronograma realista onde ambos genuinamente coexistam - talvez 18 meses, talvez mais dependendo de quantos clientes você tem. As coisas-chave que realmente importam: manter a autenticação consistente em ambos os endpoints para que clientes não precisem aprender novos padrões de autenticação, manter documentação clara para cada API sem deixá-las divergir, e ter alguém (ou um time) realmente responsável por mantê-las alinhadas. Não é um trabalho glamoroso, mas evita a situação onde o suporte fica sobrecarregado porque ninguém sabe qual endpoint um cliente deveria estar usando ou por que seu código antigo de repente parou de funcionar.
Sua resposta
Entrarpara responder.