Alternative su come gestire i dati recuperati da API esterne

1

Stiamo pianificando la creazione di un'applicazione web che consumerà i dati da un'API REST interna che centralizza tutti i dati aziendali "core". Per questioni di dimostrazione, supponiamo che questa API esponga i dati per un database di prodotti di grandi dimensioni. Quindi un esempio della nostra applicazione web che utilizza l'API sarebbe:

Una vista che elenca tutti i prodotti e l'utente può aggiungere prodotti alla sua "lista dei desideri". (Esempio molto sciocco)

Ora, la difficoltà è: ogni volta che dovremmo sapere di un prodotto utente, avremmo bisogno di inviare una richiesta all'API per ottenere i nomi dei prodotti e altri dati, dato che dovremmo solo salvare il suo ID internamente. Questo è ok in questo semplice esempio, ma ci saranno casi molto più complessi di questo (Report, ad esempio) e sembra proprio molto sbagliato recuperare sempre i dati dall'API. Quindi abbiamo creato diversi approcci:

1 : recupera i prodotti dall'API sulle viste che creano i record e li salvano internamente nel nostro database. Le altre aree che utilizzano i prodotti, le interrogherebbero dal nostro Database non dall'API.

2 - Una sorta di strategia di memorizzazione nella cache. Ma dove? Chi sarebbe il responsabile della memorizzazione nella cache? L'API o il client? In tal caso, quali strategie sarebbero più adatte a questo caso?

Il caso 1 suona come una soluzione plausibile ma creerebbe un problema di sincronizzazione. Dovremmo controllare spesso per vedere se sono state apportate modifiche (il suo nome, ad esempio).

Il caso 2 sembra buono ma personalmente non ho mai visto un'architettura simile prima né ne ho implementato uno.

Un'altra cosa che è emersa è stata: se salvassimo solo gli ID nel nostro db locale, quando abbiamo bisogno di "costruire" la vista con tutti i dati, avremmo bisogno di interrogare il nostro db locale ottenendo tutti gli id del prodotti utente, inviare una richiesta all'API per ottenere i prodotti. Il problema? L'API non conosce la relazione tra utente - > prodotti quindi dovremmo interrogare tutti i prodotti e in qualche modo unire i dati dalla nostra parte.

Qualunque tipo di consiglio, esperienza condivisa o praticamente qualsiasi input sarebbe molto apprezzato.

PS1: sia l'API che l'app Web sono scritte in C #.

PS2 : quando ho detto "API interna" nella domanda, intendevo che si tratta di un'API progettata dal nostro team. L'esterno nel titolo significa che l'API verrà separata dalla nostra app Web, agendo come una risorsa esterna.

    
posta jpgrassi 19.04.2016 - 13:11
fonte

3 risposte

2

Se seguo correttamente, stai considerando l'utilizzo di un'API che fornisce solo un'interfaccia stupida nei tuoi dati, ovvero che non puoi eseguire una query tramite l'API, puoi solo richiedere tutti i dati in un'unica soluzione.

Quindi se vuoi cercare il Prodotto per un utente devi recuperare tutti, diciamo, 20 milioni di prodotti e sul lato client filtrarli attraverso quelli che appartengono all'utente e quindi visualizzarli solo.

Se questo è il caso, allora sì che farà schifo.

La soluzione migliore è chiedere al team dell'API di modificare l'API in modo che possa essere interrogato in modo da poter chiedere a risorse specifiche non solo tutto o niente.

Se ciò non è possibile, prova a convincerli a mettere una cache di fronte alla chiamata dell'API, quindi almeno è veloce.

Se non puoi farlo allora un'altra alternativa è usare qualcosa come memcache da parte tua per salvare ogni copia dei dati. Puoi controllare quando invalidi questa cache (diciamo ogni minuto circa).

In ultima analisi, se l'API dei dati non è discutibile, avrai difficoltà a trovare la soluzione che ti viene in mente, quindi se riesci a convincere quel team a migliorare l'API

    
risposta data 21.04.2016 - 18:05
fonte
3

Se vuoi facilitare il caricamento sui server in cui i servizi web che forniscono gli endpoint REST vivono, non c'è altro modo che introdurre la cache su questi server.

Potresti specificare un vincolo che un client dovrebbe introdurre nella cache della sua applicazione in modo da non colpire i tuoi servizi spesso, ma come garantirai che ciò accada davvero, anche quando il client è ancora il stessa compagnia.

Se vuoi qualcosa fatto in modo affidabile, introdurlo nel tuo sistema. Non aspettarti che gli altri facciano il sollevamento pesante.

Tra l'altro, l'intero punto di incapsulamento del database dietro i servizi Web è quello di introdurre i middleware per intercettare le richieste, che possono quindi andare a un database ma possono anche essere inoltrate a sistemi come Redis o Elastic.

Se un client chiama l'API per recuperare i dati A da te, ma in base al valore A deve interrogare manualmente il database stesso, il livello intermedio ha poco senso.

Tutto dovrebbe passare attraverso di esso.

D'altra parte, se il tuo servizio web è stabile e veloce, fornendo risposte rapidamente, e il cliente ritiene ancora che le chiamate a api siano il collo di bottiglia dell'applicazione, allora è responsabilità dei clienti rendere la sua applicazione più veloce, non tuo.

Nel complesso, i servizi Web per recuperare i dati non sono considerati negativi, a meno che non siano limitati dalla quantità di richieste che potresti eseguire durante un giorno.

Non complicare eccessivamente le cose.

Ti senti come se le risposte dai servizi web potessero essere più veloci? Introdurre la memorizzazione nella cache sul sistema che utilizza le richieste di servizio Web.

Le risposte dei servizi web sono abbastanza veloci ma l'applicazione client è ancora lenta perché è necessario chiamare costantemente i servizi web? Introduci la cache nell'app client.

    
risposta data 19.04.2016 - 14:21
fonte
1

Hai detto:

Now, the difficulty is: each time we would have to know about a user products, we would need to send a request to the API to get the products names and other data, since we would only save its Id internally. This is okay in this simple example, but there will be cases much more complex than this (Reports, for instance) and it just seems very wrong to always fetch data from the API

Non sono sicuro che sia sbagliato per recuperare sempre i dati dall'API, inizialmente almeno. Stai parlando di cache, ma non appena introduci il caching, devi preoccuparti di invalidare e aggiornare quella cache, e questo è sempre il problema principale.

Quindi, tornando indietro per un momento, sai che avrai un problema di prestazioni? Data la complessità dell'introduzione del caching affidabile, potrei forse avere una soluzione pronta e funzionante, e quindi determinare dove sono i colli di bottiglia prima di introdurre miglioramenti delle prestazioni.

    
risposta data 19.04.2016 - 13:27
fonte

Leggi altre domande sui tag