Vai al contenuto principale

GraphQL Apollo Federation Subscriptions

Sviluppo API GraphQL per API Dati Flessibili ed Efficienti

GraphQL elimina l’over-fetching e l’under-fetching consentendo ai client di richiedere esattamente i dati di cui hanno bisogno — riducendo i round trip delle API, la dimensione dei payload e la complessità frontend. Progettiamo schemi GraphQL, ottimizziamo le performance dei resolver (DataLoader, limitazione della profondità delle query), implementiamo subscription in tempo reale e costruiamo gateway GraphQL federati per clienti USA e UE su backend Node.js, Python e Java.

Richiedi una proposta Vedi i casi

Sviluppatore che costruisce uno schema API GraphQL per query flessibili

GraphQL elimina l’over-fetching e l’under-fetching consentendo ai client di richiedere esattamente i dati di cui hanno bisogno — riducendo i round trip delle API, la dimensione dei payload e la complessità frontend. Progettiamo schemi GraphQL, ottimizziamo le performance dei resolver (DataLoader, limitazione della profondità delle query), implementiamo subscription in tempo reale e costruiamo gateway GraphQL federati per clienti USA e UE su backend Node.js, Python e Java.

Sfide

Sfide di settore che affrontiamo

Problema N+1 dei resolver

Le query GraphQL annidate generano N+1 chiamate al database — una per ogni elemento padre. Implementiamo DataLoader per tutti i resolver di liste, raggruppando le chiamate al database in un’unica query per tipo per request.

Esposizione eccessivamente permissiva dello schema

L’introspection abilitata in produzione espone il modello dati completo agli attaccanti. Disabilitiamo l’introspection in produzione, aggiungiamo la limitazione della profondità delle query (max 7 livelli) e l’analisi della complessità delle query (punteggio max 1000).

Versionamento dello schema senza rompere i client

Gli schemi GraphQL sono senza versione — la deprecazione dei campi richiede il coordinamento con tutti i client. Utilizziamo le direttive @deprecated, monitoriamo l’utilizzo dei campi deprecati in Apollo Studio e manteniamo una timeline di rimozione dei campi concordata con i team client.

Complessità della federation in scala

I supergraph di Apollo Federation con 10+ subgraph introducono sfide di distributed tracing e fallimenti di composizione dello schema. Strutturiamo i confini dei subgraph per dominio, testiamo la composizione in CI e implementiamo il distributed tracing a livello di gateway.

Scalabilità delle subscription in tempo reale

Le subscription basate su WebSocket sono stateful — non scalano orizzontalmente senza un backend pub/sub. Utilizziamo Redis pub/sub come livello di trasporto delle subscription in modo che qualsiasi istanza del gateway possa servire qualsiasi subscription.

Controllo degli accessi a livello di campo per GDPR

Il GDPR richiede che i dati personali UE vengano restituiti solo ai chiamanti autorizzati. Implementiamo direttive di campo a livello di resolver (@auth, @redact) che verificano i claim dal contesto JWT prima di restituire i campi contenenti dati personali — non al livello HTTP.

Soluzioni

Soluzioni che realizziamo

Progettazione ed evoluzione dello schema GraphQL

Progettazione dello schema domain-driven con paginazione in stile relay, tipi di connessione e validazione degli input — costruito per un’evoluzione a lungo termine senza rompere i client.

Hardening della sicurezza in produzione

Introspection disabilitata, limiti di profondità e complessità delle query, query persistenti per i client di produzione, validazione del contesto JWT e direttive @auth a livello di campo.

DataLoader e ottimizzazione delle performance

Batching DataLoader per tutti i pattern resolver N+1, caching delle query Redis per i resolver costosi, e analisi della complessità delle query per identificare le operazioni costose prima che raggiungano la produzione.

Gateway Apollo Federation

Supergraph federato da più subgraph — riferimenti alle entità, direttive @key, test di composizione dei subgraph in CI e distributed tracing a livello di gateway.

Subscription GraphQL in tempo reale

Subscription WebSocket con backend Redis pub/sub — scalabile orizzontalmente, con riconnessione automatica e deduplicazione delle subscription sul client.

Migrazione da REST a GraphQL

Strategia di migrazione incrementale: il gateway GraphQL avvolge gli endpoint REST esistenti tramite RESTDataSource, gradualmente sostituiti da resolver nativi man mano che il backend migra.

Stack

Stack tecnologico

GraphQL, Apollo Server 4, Apollo Federation 2, DataLoader, GraphQL Yoga, Strawberry (Python), Netflix DGS (Java), WebSocket (subscription), PostgreSQL, Redis, Sentry.

Conformità

Conformità e regolamentazioni

Allineato GDPR · limitazione profondità query · autenticazione a livello di campo · mascheramento dati personali nei resolver

UE

  • GDPR — controlli di permesso a livello di campo nei resolver; campi con dati personali mascherati per i ruoli non autorizzati; log di audit delle query.
  • EU AI Act — logging dei campi di decisione per i resolver GraphQL basati su AI.
  • eIDAS — validazione JWT OAuth2 nel contesto Apollo; propagazione dei claim di ruolo ai resolver.
  • NIS2 — limitazione di complessità e profondità delle query per prevenire DoS; scansione CVE delle dipendenze GraphQL.

USA

  • HIPAA — campi PHI limitati ai ruoli resolver autorizzati; log di audit per ogni accesso ai campi.
  • SOC 2 — logging delle query, cattura degli errori dei resolver in Sentry, rate limiting tramite Redis.
  • CCPA/CPRA — resolver per le richieste degli interessati; opt-out dei campi con dati personali tramite direttiva.
  • FedRAMP-adjacent — cifratura a livello di campo per i dati sensibili nei resolver.

Perché YuSMP

Perché i team di prodotto scelgono YuSMP per lo sviluppo GraphQL

Schema-first, non resolver-first

Progettiamo lo schema GraphQL come contratto di prodotto prima di scrivere i resolver — garantendo che l’API serva le esigenze frontend, non la convenienza backend.

DataLoader dal primo resolver

N+1 è il problema di produzione GraphQL più comune. Implementiamo DataLoader per ogni resolver di lista dal primo giorno, non dopo il primo incidente di performance.

Federation-ready fin dall’inizio

Anche i progetti single-graph sono costruiti con tipi compatibili con la federation — direttive @key, resolver di entità — in modo che aggiungere un secondo subgraph in seguito sia additivio, non distruttivo.

Domande frequenti

FAQ sullo Sviluppo GraphQL

Quando conviene usare GraphQL invece di REST?

GraphQL è la scelta migliore quando: più client (web, iOS, Android, partner) consumano la stessa API con esigenze di dati diverse; il team frontend cambia frequentemente i requisiti sui dati; si necessita di subscription in tempo reale accanto alle query; o si sta costruendo una piattaforma prodotto dove sviluppatori terzi interrogano i vostri dati. REST è la scelta migliore per servizi CRUD semplici, API pubbliche dove il caching HTTP è critico, o team senza esperienza GraphQL dove la curva di apprendimento supera i vantaggi.

Come funziona Apollo Federation?

Apollo Federation 2 compone più schemi di subgraph in un unico supergraph. Ogni subgraph possiede i propri tipi di dominio ed espone entità decorate con @key. L’Apollo Router (o Apollo Gateway) instrada le query in arrivo ai subgraph corretti, recupera i riferimenti alle entità tramite le direttive @external e @requires, e assembla la risposta. La composizione dello schema è validata in CI — il router si avvia solo se il supergraph composto è valido.

Come si prevengono gli attacchi denial-of-service su GraphQL?

Limitazione della profondità delle query (max 7 livelli), analisi della complessità delle query (punteggio max 1000, calcolato per campo), rate limiting sul livello HTTP tramite Redis, query persistenti (i client di produzione possono eseguire solo query pre-approvate) e introspection disabilitata in produzione. Per API di larga scala, aggiungiamo APQ (Automatic Persisted Queries) per ridurre la dimensione del payload e il rilevamento di anomalie di Apollo Studio per pattern di query insoliti.

Come scalano orizzontalmente le subscription GraphQL?

Le subscription GraphQL sono connessioni WebSocket — stateful. Una singola istanza server può gestire migliaia di subscription, ma la scalabilità orizzontale richiede l’instradamento degli eventi di subscription al server corretto. Utilizziamo Redis pub/sub: quando si verifica un evento, il servizio di pubblicazione scrive su Redis; ogni istanza del gateway si iscrive a Redis e inoltra l’evento alla connessione WebSocket corretta. Questo scala a centinaia di migliaia di subscription concorrenti.

Come gestite i caricamenti di file in GraphQL?

La spec GraphQL non copre i caricamenti di file. Utilizziamo la spec multipart request (graphql-multipart-request-spec) — tramite il supporto upload integrato di Apollo Server o il middleware graphql-upload. I file vengono streamati direttamente su S3 dal resolver senza toccare il disco del server applicativo. In alternativa, implementiamo un endpoint REST per il caricamento accanto a GraphQL per caricamenti di file grandi o frequenti.

Come si implementa la conformità GDPR in un’API GraphQL?

Controllo degli accessi a livello di campo tramite direttive personalizzate (@auth, @requiresRole) che verificano i claim JWT prima di restituire i campi contenenti dati personali. Resolver per le richieste degli interessati che anonimizzano o restituiscono tutti i dati per un dato ID utente. Audit logging delle query — ogni query viene registrata con l’ID utente autenticato e i campi risolti. Per i deployment UE, il gateway GraphQL instrada le query sulle entità residenti in UE verso resolver in regione UE che applicano la residenza dei dati.

Come si migra un’API REST a GraphQL in modo incrementale?

Utilizziamo RESTDataSource di Apollo Server per avvolgere gli endpoint REST esistenti in resolver GraphQL. Lo schema GraphQL viene progettato prima in base alle esigenze di dati dei client, poi i resolver delegano al REST. Man mano che i servizi backend vengono aggiornati, i resolver migrano dalle chiamate REST alle query dirette al database. Ciò consente ai team frontend di adottare GraphQL immediatamente mentre la migrazione backend avviene in modo incrementale nell’arco di settimane o mesi.

Costruite un’API GraphQL flessibile ed efficiente con ingegneri senior

Risposta entro 1 giorno lavorativo. NDA su richiesta.

Richiedi una proposta

Richiedi una proposta

Condividete alcuni dettagli e un consulente senior risponderà entro un giorno lavorativo.

Preferite parlare direttamente? ☎ Call +374 44 871 811 ✉ sales@yusmpgroup.com