Cosa è più veloce? Utilizzando l'API REST o interrogando direttamente un database?


16

Qual è la prestazione più veloce saggia? Creando un'API REST e facendo in modo che la tua app Web utilizzi l'API REST per eseguire tutte le interazioni con il tuo database O eseguire una query direttamente sul tuo database (ovvero utilizzando qualsiasi oggetto tipico utilizzato dalla tua lingua per eseguire query su un database come JDBC per Java)?

Il modo in cui lo vedo con REST:

  1. Si crea un oggetto nel codice per chiamare il metodo REST
  2. Chiama il metodo http
  3. Il codice all'interno dell'API REST interroga il database
  4. Il database restituisce alcuni dati
  5. Il codice API REST raggruppa i dati in Json e li invia al tuo client
  6. Il client riceve la risposta Json / XML
  7. Mappa la risposta a un oggetto nel tuo codice

D'altra parte, interrogando direttamente un database:

  1. Si crea un oggetto con stringa di query per eseguire una query sul database
  2. Il database restituisce alcuni dati
  3. Mappa la risposta a un oggetto nel tuo codice

Quindi questo non significa che l'uso di un'API REST sarebbe più lento? Forse dipende dal tipo di database (SQL vs NoSQL)?


3
Un'API REST non è un protocollo di accesso al database, quindi la domanda è un grosso errore di categoria. Un'API REST è un archivio documenti. Potrebbe usare un database sul lato server (o potrebbe non farlo). Se non hai bisogno di un'API REST, ovviamente non usarne una. Ma poi questo vale per tutto. Se non è necessario un database, non utilizzarne uno, la scrittura nel file system sarà più veloce di un database. Se non è necessario un file system, non utilizzarne uno, la scrittura su RAM è più veloce del disco. Se non hai bisogno di RAM, non utilizzarla, scrivere nella cache della CPU è più veloce, ecc, ecc. Ecc.
Cormac Mulhall,

1
"D'altra parte" richiede di esporre il database al grande mondo cattivo.
Pieter B,

@PieterB: No, "d'altra parte" sta esponendo il database all'app Web attendibile.
Jacques B

@JacquesB e l'app Web viene eseguita sul computer client. Quindi non dovrebbe essere attendibile perché potrebbe essere una versione modificata.
Pieter B,

@PieterB: la domanda non indica nulla sull'app Web in esecuzione su un server non attendibile. Sarebbe una configurazione molto insolita.
Jacques B

Risposte:


18

Quando aggiungi complessità, il codice verrà eseguito più lentamente. L'introduzione di un servizio REST se non è necessario rallenterà l'esecuzione poiché il sistema sta facendo di più.

Estrarre il database è una buona pratica. Se sei preoccupato per la velocità, puoi esaminare la memorizzazione nella cache dei dati in modo da non dover toccare il database per gestire la richiesta.

Prima di ottimizzare le prestazioni, anche se esaminerei quale problema stai cercando di risolvere e l'architettura che stai utilizzando, faccio fatica a pensare a una situazione in cui le opzioni del database sarebbero l'accesso diretto vs REST.


+1 per menzionare la memorizzazione nella cache. Anche se lo sta facendo extra work. Ma in realtà potrebbe essere più veloce memorizzando nella cache query ripetute.
Yana Agun Siswanto,

3
@Klee La tua risposta non è del tutto giusta. »L'introduzione di un servizio REST se non è necessario rallenterà l'esecuzione man mano che il sistema sta facendo di più.« In tutti i casi non vi è alcun traffico verso l'endpoint, se ad esempio un proxy inverso è in grado di gestire risultati cahced.
Thomas Junk,

@klee Il motivo per cui ho posto questa domanda è stato da questo post SO programmers.stackexchange.com/questions/277701/… - una risposta parla di come Amazon ha avuto un grande successo utilizzando un sistema completamente RESTful invece dell'accesso diretto. Mi ha appena fatto pensare ...
Micro

9

Se la tua preoccupazione è la velocità, sì, un servizio di riposo sarà più lento per i motivi sopra indicati. Tuttavia, la velocità del tipo che descrivi è raramente la preoccupazione principale e, se lo è, può essere affrontata in altri modi. L'ottimizzazione prematura è la radice di tutti i mali .

Considera se la tua preoccupazione principale è l'interoperabilità (mobile, web, B2B), ora REST è molto interessante perché è indipendente dalla tecnologia.

Supponi di codificare un database. Cosa faresti se scegli di modificare il tuo archivio dati sottostante. Quanto sarebbe difficile da fare se sei strettamente associato al negozio sottostante?

La vera risposta è che dipende , ma spero di averti dato alcune cose a cui pensare!


6

Se trovi difficile rispondere a questa domanda.

La risposta generale corretta dovrebbe essere: dipende.

Il modo in cui lo vedo con REST:

  1. Si crea un oggetto nel codice per chiamare il metodo REST
  2. Chiama il metodo http
  3. Il codice all'interno dell'API REST interroga il database
  4. Il database restituisce alcuni dati
  5. Il codice API REST raggruppa i dati in Json e li invia al tuo client
  6. Il client riceve la risposta Json / XML
  7. Mappa la risposta a un oggetto nel tuo codice

C'è un errore nel tuo pensiero.

E questo errore deriva dal fatto che non si comprende appieno REST e i suoi principi. REST non è stato inventato, perché alcuni secchioni hanno trovato interessante (ovviamente lo è) inviare oggetti Javascript via HTTP tramite il filo. Il vantaggio principale dell'utilizzo di HTTP è la possibilità di utilizzare la cache . Se rendi i risultati memorizzabili nella cache , allora ci sono meno richieste da fare al DB. E non è coinvolto il marshalling . La risposta potrebbe essere consegnata direttamente.

Pertanto la risposta di @Klees non è del tutto corretta :

Quando aggiungi complessità, il codice verrà eseguito più lentamente. L'introduzione di un servizio REST se non è necessario rallenterà l'esecuzione poiché il sistema sta facendo di più.

Quando si ha a che fare con i risultati memorizzati nella cache, non vi è alcun impatto sulla propria applicazione: la consegna di risposte note a domande note potrebbe essere effettuata tramite proxy inversi.


4
Se i dati sono memorizzabili nella cache in un livello di servizio di riposo, sono memorizzabili nella cache nell'app Web, il che sarebbe molto meglio per le prestazioni.
JacquesB,

Il modo più veloce è di non colpire affatto l'app Web.
Thomas Junk,

1
E solo per renderlo più interessante, non tutti gli "hit" nel database sono uguali se è possibile accedere alla memoria v. Il disco.
JeffO,

@ThomasJunk: se ho capito correttamente la domanda originale, il client è un'app Web e la domanda è se l'app Web deve connettersi direttamente al db o chiamare tramite un servizio di riposo.
Jacques B

1
Ciò non cambia nulla nella mia risposta. La chiamata a un servizio REST include la chiamata a un server Web che potrebbe essere dietro un proxy inverso in cui è possibile memorizzare nella cache possibili risposte, come ho già detto.
Thomas Junk,

2

L'introduzione di un livello di servizio aggiuntivo comporta sempre un costo in termini di complessità e costi generali. Esistono alcuni tipi specifici di architettura in cui l'introduzione di un livello di servizio condiviso (come un'API REST) ​​può migliorare le prestazioni a causa della memorizzazione nella cache condivisa, ma sembra che non sia il tipo di architettura che hai.

Prendi in considerazione un'architettura in cui hai più app Web o più app desktop che si collegano direttamente allo stesso database. Se eseguono spesso le stesse query, è possibile che le prestazioni della cache vengano migliorate in un servizio condiviso. Soprattutto se si dice che centinaia di app desktop accedono direttamente allo stesso database (non tramite un'app Web!) E che eseguono le stesse query, ci potrebbe essere un notevole miglioramento. Tuttavia, anche in questa architettura, il motivo principale per l'introduzione di un servizio condiviso sarebbe probabilmente la sicurezza e l'astrazione dei dati piuttosto che le prestazioni.

Ma sembra che tu abbia una singola app Web che si collega direttamente al database. In tal caso non vi è alcun vantaggio nell'introdurre un livello di servizio aggiuntivo. La memorizzazione nella cache, l'astrazione del database ecc. Potrebbero essere gestite a livello di accesso ai dati nella stessa applicazione.


1

Dipende.

Ovviamente, più strati nel codice sono più lenti. Ma ... arriva un punto in cui le prestazioni end-to-end dirette non contano tanto quanto la scalabilità. Se hai 1 utente che accede al tuo database su un PC locale, può andare veloce. Se hai un migliaio di utenti che accedono allo stesso DB sullo stesso PC, è probabile che li vedrai frustrati. La soluzione è spostare il DB in un'altra casella, aggiungere un livello nel mezzo e sebbene per 1 utente, funzionerà più lentamente, quando i mille accederanno, andrà più veloce. (questa è una risposta semplicistica ma in linea di principio vera).

Esistono altri motivi per nascondere il DB dietro un livello di livello intermedio, come la sicurezza.


-2

Non so dove ti perdi, ma è abbastanza chiaro, quando stai usando l'API REST stai facendo un passo in più, e un passo in più "sempre" significa più lentamente quando si tratta di programmazione.

Ci sono pro e contro, ma se puoi accedere al database direttamente dalla tua applicazione è sempre meglio chiamarlo direttamente invece di usare l'API Web, ovviamente se usi l'API Web puoi facilmente portare la tua applicazione su piattaforme diverse.


1
»Non so dove ti perdi, ma è abbastanza chiaro, quando stai usando l'API REST stai facendo un passo in più, e il passaggio in più" sempre "significa più lento quando la programmazione è coinvolta.« Se ciò significa un rallentamento nell'esecuzione, non è giusto.
Thomas Junk,

1
Non ci sono situazioni in cui l'accesso al database è una cattiva idea oltre alla semplice portabilità? A volte avere un'API REST ecc può mantenere più logica (e una migliore sicurezza?) Sul lato server, giusto?
J Trana,

@JTrana che può essere sì o no, dipende davvero da come fai mentre si introduce un livello aggiuntivo in grado di fornire un ulteriore livello di sicurezza, l'aggiunta di un livello aggiuntivo significa anche che hai più possibilità di rovinare qualcosa ed esporre un buco nella sicurezza. Penso che il punto dell'API Web sia esporre la tua "API". Le grandi applicazioni come Facebook, Amazon, Google che devono fornire accesso a terze parti e hanno molte piattaforme devono disporre di API Web, ma per le piccole applicazioni devi pensarci due volte prima di farlo.
Kirie,

-2

RIPOSO :

  • aperto a più frontend e 1 backend
  • devi creare la tua API (o usarne una come Loopback)
  • non funziona offline

DB locale:

  • non aperti a "livelli", devono sincronizzare l'accesso al back-end
  • non è necessario creare un'API, utilizzare l'interfaccia DB
  • lavorare offline

QUESTA È DIFFERENZA MOLTO ENORME, LE PERSONE SONO DIMENTICATE DIMENTICATE QUESTI PUNTI


2
-1. Sebbene non sia necessario "creare" un'API, la mancata creazione di un DAL comporta spesso un enorme dolore nel caso in cui sia necessario modificare il backend del database. Inoltre, non c'è motivo per cui se il DB è "offline", il servizio Rest non potrebbe essere reso disponibile anche lì.
James Snell,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.