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

13

Che cos'è una performance più veloce? Creare un'API REST e far sì che l'app Web utilizzi l'API REST per eseguire tutte le interazioni con il database OPPURE eseguire query direttamente sul database (ad esempio utilizzando l'oggetto tipico utilizzato dalla lingua per eseguire query su un database come JDBC per Java)?

Il modo in cui lo vedo con REST:

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

D'altra parte, interrogando direttamente un database:

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

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

    
posta Micro 15.06.2015 - 05:41
fonte

7 risposte

18

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

L'astrazione del database è una buona pratica. Se sei preoccupato per la velocità, puoi cercare nella cache i dati in memoria in modo che il database non debba essere toccato per gestire la richiesta.

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

    
risposta data 15.06.2015 - 06:19
fonte
7

Se la tua preoccupazione è la velocità, allora 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 .

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

Supponiamo che tu codice per un database. Cosa faresti se decidessi di cambiare il tuo archivio dati sottostante. Quanto sarebbe difficile da fare se sei strettamente collegato al negozio sottostante?

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

    
risposta data 15.06.2015 - 10:06
fonte
4

Se trovi difficile rispondere a questa domanda.

La risposta generale corretta dovrebbe essere: dipende.

The way I see it with REST:

  1. You make an object in your code to call the REST method
  2. Call http method
  3. Code inside your REST API queries the database
  4. Database returns some data
  5. REST API code packs up the data into Json and sends it to your client
  6. Client receives Json/XML response
  7. Map response to an object in your code

C'è un errore nel tuo pensiero.

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

La risposta di @Klees è non del tutto corretta :

When you add complexity the code will run slower. Introducing a REST service if it's not required will slow the execution down as the system is doing more.

Quando si hanno a che fare con risultati di cache, non c'è alcun impatto sulla tua applicazione: fornire risposte note a domande note può essere fatto tramite proxy inversi.

    
risposta data 15.06.2015 - 12:38
fonte
2

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

Considera 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, può migliorare le prestazioni per memorizzare nella cache i risultati delle query in un servizio condiviso. Soprattutto se dici che centinaia di app desktop accedono allo stesso database direttamente (non tramite un'app Web!) E eseguono le stesse query, potrebbe esserci un notevole miglioramento. Tuttavia, anche in questa architettura, la ragione principale per introdurre 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'introduzione di un livello di servizio aggiuntivo. La memorizzazione nella cache, l'astrazione del database, ecc. Possono essere gestiti nel livello di accesso ai dati nella stessa applicazione.

    
risposta data 17.06.2015 - 10:44
fonte
1

Dipende.

Ovviamente, più livelli nel tuo 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 vedrai che tutti si sentiranno frustrati. La soluzione è spostare il DB in un'altra casella, aggiungere un livello nel mezzo e sebbene per 1 utente, si eseguirà più lentamente, quando i mille accedono, andrà più veloce. (questa è una risposta semplicistica ma vera in linea di principio).

Ci sono altri motivi per nascondere il tuo DB dietro un livello intermedio, come la sicurezza.

    
risposta data 15.06.2015 - 14:34
fonte
-2

Non so dove ti perda, ma è abbastanza chiaro, quando stai usando l'API REST stai facendo un passo in più, e il passo extra "sempre" significa più lento quando la programmazione è coinvolta.

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 trasferire la tua applicazione su una piattaforma diversa.

    
risposta data 15.06.2015 - 06:19
fonte
-2

REST:

  • aperto a multi frontend e 1 back-end
  • devi creare la tua API (o usarne una come Loopback)
  • non funziona offline

DB locale:

  • non aperto ai "tier", devono avere accesso al tuo back-end per sincronizzare
  • non è necessario creare un'API, utilizzare l'interfaccia DB
  • funziona offline

QUESTO È QUELLO DI DIFFERENZA ENORME, PERSONE SPESSO DIMENTICATI QUESTI PUNTI

    
risposta data 10.03.2016 - 16:15
fonte

Leggi altre domande sui tag