Come dovrebbe essere progettato il trasferimento dei dati tra un client e un'API Web per i dati normalizzati?

2

Voglio progettare un'API supportata da un database (non importa quale, ma per rendere la discussione più interessante, diciamo che è Mongo - spiegazione in basso) che invia i dati a un client.

Il database contiene diversi tipi di record. Alcuni di essi fanno riferimento ad altri tipi di record.
Non è raro che un record sia referenziato da diversi altri record di diverso tipo. Quindi i dati sul DB sono normalizzati.

Quali sono le considerazioni nella progettazione di un server API che invia i record al client?

Mi vengono in mente due opzioni (sei invitato a suggerire di più oa correggermi su quelle):

  1. L'API è granulare. Invia dati normalizzati. Lascia che il cliente chieda più record in base a ciò che riceve. Il client può avere una cache, esso può decidere che non ha bisogno di chiedere al server per tutto.
  2. L'API invia tutti i record che potrebbero essere necessari al client in base a dati richiesti In tal modo denormalizzando efficacemente i dati.

Con l'opzione 1, il client può effettuare più richieste HTTP in modo che possa avere i dati completi di cui ha bisogno. Significa più comunicazione di rete, che può rallentare il trasferimento totale dei dati. Il server è più semplice e il client può chiedere selettivamente solo i record che non ha già.

Con l'opzione 2, meno richieste HTTP. Ma potremmo inviare i dati del cliente che ha già (forse già ricevuto e memorizzato nella cache, alcuni dei record in una precedente richiesta). Il server è più complicato. Soprattutto se non è RDBMS. Non ci sono join in Mongo, quindi dobbiamo interrogare il DB più di una volta per ottenere tutti i dati.

Ulteriori ipotesi:

  1. I dati cambiano ogni pochi giorni (2-3 volte a settimana). Quindi il client può potenzialmente avere una cache persistente.
  2. Le query Mongo sono un po 'lente (milioni di documenti in ogni raccolta).
  3. In ciascuna di queste sessioni verranno inviati al cliente circa 2 MB di dati.
posta EyalAr 29.07.2014 - 07:49
fonte

1 risposta

2

Opzione 1

Sebbene sia allettante disporre di un set di API leggere che inviano i dati normalizzati, ci sono alcune potenziali insidie con questo approccio.

In primo luogo, la leggerezza di queste API potrebbe finire per essere pagata con un accoppiamento stretto tra il modello di dati normalizzato e le tue API. Se si desidera modificare il modello di dati o le API, sarà necessario modificare l'altro o progettare un metodo per preservare il vecchio approccio dall'altra parte della modifica. Questo complica la manutenzione.

In secondo luogo, hai ragione di notare che ci saranno molte chiamate HTTP dal client alle tue API. Mettiti nei panni dell'implementatore del client e chiedi se vuoi davvero fare tutte quelle chiamate API. Con il corretto controllo degli errori e la gestione delle eccezioni, ci vuole molto lavoro.

Opzione 2

D'altra parte, a volte un approccio "una chiamata fa tutto" è il migliore. L'approccio "invia tutto" dell'opzione 2 può essere molto più semplice per il cliente e, data la sua natura denormalizzata, fornisce un'interfaccia di fatto tra client e server che dovrebbe essere semplice da mantenere man mano che i due si sviluppano e si evolvono separatamente. Il prezzo con questo è velocità e dimensioni. Come si nota, potrebbe essere necessario un po 'di tempo per assemblare tutti quei dati, quindi trasmetterli, soprattutto se è necessaria solo una piccola parte di essi. Ma non dimenticare, sarà molto più veloce recuperare tutti i dati sulla LAN del tuo data center piuttosto che farlo sul client tramite Internet.

Raccomandazione

Mi chiamo verso l'opzione 2, anche se propongo di aggiungere una dose dell'opzione 1 per trovare un equilibrio tra semplicità e prestazioni. Se alcuni dati richiedono un tempo eccezionalmente più lungo della media per essere assemblati, verifica se è possibile lasciarlo fuori dall'API principale e inserirlo in uno separato. Ricorda, l'obiettivo è quello di semplificare sia il server che il client.

Avvertenze sulla cache

Poiché i dati cambiano ogni 2-3 giorni, fai attenzione alla memorizzazione nella cache. Dal momento che i dati sono così grandi e costosi da assemblare, il caching è allettante e probabilmente una buona idea. Tuttavia, poiché sta cambiando regolarmente, assicurati di aggiornare la cache e prendere provvedimenti per forzare il client a recuperare nuovi dati quando è disponibile. Tecniche come parametri API di busting della cache, tempi di osservazione, tempi di scadenza e simili potrebbero essere utili qui.

    
risposta data 29.07.2014 - 08:04
fonte

Leggi altre domande sui tag