6 risposte
Mantieni entrambe le API in parallelo per un po' - continua a far funzionare REST esattamente come è adesso mentre lanci GraphQL come nuovo endpoint. Dai ai client il tempo di migrare al loro ritmo, magari un anno o più a seconda di quanti te lo usano. Documenta bene il lato GraphQL così la migrazione sembra facile, non forzata. Una volta che la maggior parte si è spostata, puoi deprecare REST gradualmente con tanto preavviso.
Eseguire entrambi in parallelo funziona, ma il vero punto dolente che nessuno menziona è che dovrai mantenere sincronizzati il tuo database layer e la logica di business su due forme di query diverse - inevitabilmente un team inizia a ottimizzare per GraphQL mentre i client REST colpiscono lo stesso backend e si chiedono perché ricevono timeout. Un approccio più pulito è costruire GraphQL sopra i tuoi endpoint REST esistenti come un layer adattatore innanzitutto, così non stai effettivamente mantenendo due percorsi di codice separati, solo uno strato di traduzione che prova che lo schema funziona prima di toccare il backend stesso.
L'approccio dual-API ha senso, ma ecco cosa spesso viene saltato: versionare esplicitamente gli endpoint REST (tipo `/api/v1/`) già prima di introdurre GraphQL. Ti dà una separazione netta e significa che quando eventualmente abbandonerai REST, non strappi il tappeto sotto i piedi a chi lo sta ancora usando. Possono restare su v1 per sempre se necessario, e avrai un percorso di deprecazione chiaro documentato dal primo giorno.
Il problema di sincronizzazione che è stato menzionato è reale e doloroso. Quello che aiuta è fare affidamento pesante su adapter interni o un livello di astrazione per le query - sostanzialmente un compromesso che sia REST che GraphQL possono richiamare, così la tua logica di business resta DRY. Se costruisci resolver GraphQL che si traducono nelle stesse chiamate di servizio sottostanti dei tuoi controller REST, riduci la possibilità che derivino e servano dati diversi. È un po' più lavoro all'inizio ma ti salva dal debuggare "perché questo campo ha valori diversi in GraphQL rispetto a REST" tra sei mesi.
Vale anche la pena pensare a: quali client sono più importanti? Se hai 100 servizi interni che usano la tua REST API contro una manciata di consumatori pubblici, la tua timeline di migrazione e la strategia di comunicazione dovrebbero essere completamente diverse. I team interni possono muoversi più velocemente, e puoi effettivamente forzare la migrazione. Gli utenti esterni hanno bisogno di molto più preavviso e pazienza.
il problema più grande che la gente sottovaluta è che finisci per mantenere due documentazioni completamente separate, SDK e flussi di autenticazione se non stai attento - il che significa che il tuo team di supporto viene tempestato di domande su quale API usare, e gli sviluppatori scelgono quella sbagliata. prima di lanciare GraphQL, fissa esattamente per quanto tempo REST rimane supportato (tipo 18 mesi con una data di fine definitiva) e comunicalo in modo ossessivo, perché l'ambiguità è quello che ammazza queste migrazioni. stai pianificando di mantenere la parità di funzionalità tra entrambe le API durante la transizione, o GraphQL avrà le nuove funzionalità prima per incentivare il passaggio?
Non cercare di fare uno specchio perfetto tra i tuoi schemi REST e GraphQL - è quello che mette in difficoltà la gente. Mantienili intenzionalmente poco rigidi così GraphQL può trasformare le query nel modo che ha più senso per i client, mentre il tuo livello REST rimane stabile; sincronizza al livello dei dati, non al livello del contratto API, e eviterai la maggior parte dell'incubo di manutenzione che viene dal cercare di mantenere due interfacce identiche.
Non cercare di sostituire REST da un giorno all'altro o fare una deprecazione graduale dove stai già spingendo i client verso la nuova cosa mentre la vecchia esiste ancora - è quando le cose si rompono, la gente si confonde su quale endpoint usare, e comunque finisci con un ecosistema frammentato.
Il percorso più pulito è stabilizzare prima la tua REST API. Assicurati che stia facendo quello che deve fare, documentala bene, e poi aggiungi GraphQL come un livello di servizio completamente separato sopra le stesse fonti di dati. Questo significa che la tua logica di business e il database non hanno bisogno di sapere di nessuno dei due formati API - stanno solo parlando lo stesso sistema sottostante. Non stai duplicando il codice, stai semplicemente aggiungendo un altro modo per interrogarlo. Questo toglie la pressione dal problema di sincronizzazione che emerge quando stai cercando di tenere sincronizzati due pattern di query diversi.
Stabilisci una timeline realistica dove entrambi coesistono davvero - magari 18 mesi, magari più a lungo a seconda di quanti client hai. Le cose che contano davvero: mantieni l'autenticazione coerente su entrambi gli endpoint così i client non devono imparare nuovi pattern di autenticazione, mantieni una documentazione chiara per ogni API senza farle allontanare, e avere qualcuno (o un team) effettivamente responsabile di tenerle allineate. Non è un lavoro glamoroso, ma previene la situazione dove il supporto viene sepolto perché nessuno sa quale endpoint un client dovrebbe usare o perché il suo codice vecchio ha improvvisamente smesso di funzionare.
La tua risposta
Accediper rispondere.