Ma è davvero importante? Considera che l'interfaccia utente deve effettuare una chiamata di rete all'API; è piuttosto grande (ordine di grandezza di millisecondi). I database sono ottimizzati per mantenere le cose in memoria ed eseguire letture molto, molto rapidamente (ad es. SQL Server carica e mantiene tutto nella RAM e, se possibile, consuma quasi tutta la RAM libera).
La logica
In teoria, hai ragione. Tuttavia, ci sono alcuni difetti con questa logica:
Da quello che hai dichiarato, non è chiaro se hai effettivamente testato / profilato la tua app. In altre parole, si fa realmente sapere che i trasferimenti di rete da l'applicazione per l'API sono la componente più lento? Perché è intuitivo, è facile supporre che lo sia. Tuttavia, quando si discute delle prestazioni, non si deve mai supporre. Al mio datore di lavoro, sono il responsabile delle prestazioni. Quando mi sono unito per la prima volta, le persone continuavano a parlare di CDN, repliche, ecc. In base all'intuizione su quali fossero i colli di bottiglia. A quanto pare, i nostri maggiori problemi di prestazioni erano scarsi risultati delle query del database.
Stai dicendo che, poiché i database sono bravi a recuperare i dati, il database è necessariamente in esecuzione alle massime prestazioni, viene utilizzato in modo ottimale e non è possibile fare nulla per migliorarlo. In altre parole, i database sono progettati per essere veloci, quindi non dovrei mai preoccuparmene. Un'altra linea di pensiero pericolosa. È come dire che un'auto è destinata a muoversi rapidamente, quindi non ho bisogno di cambiare l'olio.
Questo modo di pensare presuppone un singolo processo alla volta o, in altre parole, nessuna concorrenza. Presuppone che una richiesta non possa influenzare le prestazioni di un'altra richiesta. Le risorse sono condivise, come I / O su disco, larghezza di banda di rete, pool di connessioni, memoria, cicli della CPU, ecc. Pertanto, la riduzione dell'utilizzo di una risorsa condivisa da parte di una chiamata al database può impedire che altre richieste rallentino. Quando ho aderito per la prima volta al mio attuale datore di lavoro, il management ha ritenuto che l'ottimizzazione di una query di database di 3 secondi fosse una perdita di tempo. 3 secondi è così poco, perché perdere tempo con esso? Non staremmo meglio con un CDN o una compressione o qualcos'altro? Ma se riesco a far eseguire una query di 3 secondi in 1 secondo, ad esempio aggiungendo un indice, ovvero 2/3 di blocco in meno, 2/3 di tempo in meno dedicato all'occupazione di un thread e, soprattutto, meno dati letti dal disco,
La teoria
C'è una concezione comune secondo cui le prestazioni del software riguardano semplicemente la velocità .
Da una prospettiva puramente veloce, hai ragione. Un sistema è veloce quanto il suo componente più lento. Se hai profilato il tuo codice e scoperto che Internet è il componente più lento, allora tutto il resto non è ovviamente la parte più lenta.
Tuttavia, dato quanto sopra, spero che tu possa vedere come la contesa di risorse, la mancanza di indicizzazione, il codice scritto male, ecc. Possano creare sorprendenti differenze nelle prestazioni.
I presupposti
Un'ultima cosa. Hai detto che una chiamata al database dovrebbe essere economica rispetto a una chiamata di rete dall'app all'API. Ma hai anche detto che l'app e i server API sono nella stessa LAN. Pertanto, non sono entrambi comparabili come chiamate di rete? In altre parole, perché stai supponendo che il trasferimento dell'API sia più lento degli ordini di grandezza rispetto al trasferimento del database quando entrambi hanno la stessa larghezza di banda disponibile? Naturalmente i protocolli e le strutture dei dati sono diversi, lo capisco, ma contesto il presupposto che siano ordini di grandezza diversi.
Dove diventa murkey
L'intera domanda riguarda le chiamate di database "multiple" contro "single". Ma non è chiaro quanti siano multipli. A causa di ciò che ho detto sopra, come regola generale, consiglio di effettuare il numero di chiamate al database necessario. Ma questa è solo una regola empirica.
Ecco perché:
- I database sono bravi a leggere i dati. Sono motori di archiviazione. Tuttavia, la logica aziendale risiede nell'applicazione. Se si stabilisce una regola secondo cui ogni chiamata API genera esattamente una chiamata al database, la logica aziendale potrebbe finire nel database. Forse va bene. Molti sistemi lo fanno. Ma alcuni non lo fanno. Si tratta di flessibilità.
- A volte per ottenere un buon disaccoppiamento, è necessario separare 2 chiamate al database. Ad esempio, forse ogni richiesta HTTP viene instradata attraverso un filtro di sicurezza generico che convalida dal DB che l'utente ha i diritti di accesso corretti. In tal caso, procedere con l'esecuzione della funzione appropriata per tale URL. Tale funzione potrebbe interagire con il database.
- Chiamata al database in un ciclo. Questo è il motivo per cui ho chiesto quanti sono multipli. Nell'esempio sopra, avresti 2 chiamate al database. 2 va bene. 3 potrebbe andare bene. N non va bene. Se si chiama il database in un ciclo, le prestazioni sono ora lineari, il che significa che richiederà più tempo rispetto all'input del ciclo. Quindi dire categoricamente che il tempo di rete dell'API è il più lento trascura completamente le anomalie come l'1% del traffico impiegando molto tempo a causa di un ciclo non ancora scoperto che chiama il database 10.000 volte.
- A volte ci sono cose in cui la tua app è migliore, come alcuni calcoli complessi. Potrebbe essere necessario leggere alcuni dati dal database, eseguire alcuni calcoli, quindi in base ai risultati, passare un parametro a una seconda chiamata al database (magari per scrivere alcuni risultati). Se li combini in una singola chiamata (come una procedura memorizzata) solo per poter chiamare il database solo una volta, ti sei costretto a utilizzare il database per qualcosa in cui il server delle app potrebbe essere migliore.
- Bilanciamento del carico: hai 1 database (presumibilmente) e più server di applicazioni con bilanciamento del carico. Pertanto, maggiore è il lavoro svolto dall'app e minore è il database, più facile è ridimensionare perché è generalmente più facile aggiungere un server app rispetto alla configurazione della replica del database. Sulla base del precedente punto elenco, potrebbe essere logico eseguire una query SQL, quindi eseguire tutti i calcoli nell'applicazione, che viene distribuita su più server, quindi scrivere i risultati al termine. Ciò potrebbe fornire un throughput migliore (anche se il tempo complessivo della transazione è lo stesso).
TL; DR
TLDR: è davvero importante preoccuparsi di più chiamate al database quando stiamo già effettuando una chiamata di rete sulla LAN? Se è così, perché?
Sì, ma solo fino a un certo punto. Dovresti cercare di ridurre al minimo il numero di chiamate al database quando possibile, ma non combinare le chiamate che non hanno nulla a che fare l'una con l'altra solo per il gusto di combinarle. Inoltre, evitare di chiamare il database in un ciclo a tutti i costi.