Qu'est-ce qui est plus rapide? Vous utilisez l'API REST ou interrogez directement une base de données?

16

Qu'est-ce qui est plus rapide en termes de performances? Créer une API REST et faire en sorte que votre application Web utilise l'API REST pour effectuer toutes les interactions avec votre base de données OU interroger directement votre base de données (c'est-à-dire utiliser n'importe quel objet typique utilisé par votre langage pour interroger une base de données telle que JDBC pour Java)?

La façon dont je le vois avec REST:

  1. Vous créez un objet dans votre code pour appeler la méthode REST
  2. Appelez la méthode http
  3. Le code dans votre API REST interroge la base de données
  4. La base de données renvoie des données
  5. Le code API REST emballe les données dans Json et les envoie à votre client
  6. Le client reçoit une réponse Json / XML
  7. Mappez la réponse à un objet dans votre code

D'un autre côté, interroger directement une base de données:

  1. Vous créez un objet avec une chaîne de requête pour interroger la base de données
  2. La base de données renvoie des données
  3. Mappez la réponse à un objet dans votre code

Cela ne signifierait-il donc pas que l'utilisation d'une API REST serait plus lente? Peut-être que cela dépend du type de base de données (SQL vs NoSQL)?

Micro
la source
3
Une API REST n'est pas un protocole d'accès à la base de données, donc la question est une grosse erreur de catégorie. Une API REST est un magasin de documents. Il POURRAIT utiliser une base de données côté serveur (ou il pourrait ne pas l'être). Si vous n'avez pas besoin d'une API REST, ne l'utilisez évidemment pas. Mais cela vaut pour tout. Si vous n'avez pas besoin d'une base de données, n'en utilisez pas, l'écriture dans le système de fichiers sera plus rapide qu'une base de données. Si vous n'avez pas besoin d'un système de fichiers, n'en utilisez pas, l'écriture sur la RAM est plus rapide que sur le disque. Si vous n'avez pas besoin de RAM ne l'utilisez pas, l'écriture dans le cache CPU est plus rapide etc etc etc
Cormac Mulhall
1
Le "d'autre part" vous oblige à exposer votre base de données au grand méchant monde.
Pieter B
@PieterB: Non, "d'autre part" expose la base de données à l'application Web de confiance.
JacquesB
@JacquesB et l'application Web s'exécutent sur l'ordinateur client. Il ne faut donc pas lui faire confiance car il pourrait s'agir d'une version modifiée.
Pieter B
@PieterB: La question ne dit rien sur l'application Web exécutée sur un serveur non approuvé. Ce serait une configuration très inhabituelle.
JacquesB

Réponses:

18

Lorsque vous ajoutez de la complexité, le code s'exécutera plus lentement. L'introduction d'un service REST s'il n'est pas requis ralentira l'exécution à mesure que le système en fera plus.

Résumé de la base de données est une bonne pratique. Si vous êtes préoccupé par la vitesse, vous pouvez envisager de mettre en cache les données en mémoire afin que la base de données n'ait pas besoin d'être touchée pour gérer la demande.

Avant d'optimiser les performances, bien que j'examine le problème que vous essayez de résoudre et l'architecture que vous utilisez, j'ai du mal à penser à une situation où les options de base de données seraient un accès direct vs REST.

Klee
la source
+1 pour mentionner la mise en cache. Bien qu'il le fasse extra work. Mais en fait, cela pourrait être plus rapide en mettant en cache des requêtes répétées.
Yana Agun Siswanto
3
@Klee Votre réponse n'est pas tout à fait correcte. »L'introduction d'un service REST s'il n'est pas nécessaire ralentira l'exécution car le système en fait plus.« Dans tous les cas, il n'y a pas du tout de trafic vers le point de terminaison, si par exemple un proxy inverse peut gérer les résultats cahcés.
Thomas Junk
@klee La raison pour laquelle j'ai posé cette question venait de ce message SO programmers.stackexchange.com/questions/277701/… - une réponse explique comment Amazon a remporté un grand succès en utilisant un système entièrement RESTful au lieu d'un accès direct. Je viens de me faire réfléchir ...
Micro
9

Si vous êtes préoccupé par la vitesse, alors oui, un service de repos sera plus lent pour les raisons indiquées ci-dessus. Cependant, la vitesse du type que vous décrivez est rarement la principale préoccupation et, si elle l'est, peut être abordée d'autres manières. L'optimisation prématurée est la racine de tout mal .

Considérez si votre principale préoccupation est l'interopérabilité (mobile, web, B2B), REST est désormais très attractif car il est indépendant de la technologie.

Supposons que vous codiez pour une base de données. Que feriez-vous si vous choisissez de modifier votre magasin de données sous-jacent. À quel point serait-il difficile de le faire si vous étiez étroitement couplé au magasin sous-jacent?

La vraie réponse est que cela dépend , mais j'espère que je vous ai donné quelques pistes de réflexion!

Romski
la source
6

Si vous avez du mal à répondre à cette question.

La bonne réponse générale devrait être: cela dépend.

La façon dont je le vois avec REST:

  1. Vous créez un objet dans votre code pour appeler la méthode REST
  2. Appelez la méthode http
  3. Le code dans votre API REST interroge la base de données
  4. La base de données renvoie des données
  5. Le code API REST emballe les données dans Json et les envoie à votre client
  6. Le client reçoit une réponse Json / XML
  7. Mappez la réponse à un objet dans votre code

Il y a une erreur dans votre pensée.

Et cette erreur vient du fait que vous ne comprenez pas bien REST et ses principes. REST n'a pas été inventé, car certains nerds ont trouvé cool (bien sûr que c'est le cas) d'envoyer des objets Javascript via HTTP sur le fil. Le principal avantage de l'utilisation de HTTP est la possibilité d'utiliser la mise en cache . Si vous rendez vos résultats mis en cache , il y a moins de demandes à faire à la BD. Et pas de triage n'est impliqué. La réponse pourrait être livrée directement.

Dans la mesure où la réponse de @Klees n'est pas tout à fait correcte :

Lorsque vous ajoutez de la complexité, le code s'exécutera plus lentement. L'introduction d'un service REST s'il n'est pas requis ralentira l'exécution à mesure que le système en fera plus.

Lorsque vous traitez des résultats en mémoire cache, il n'y a aucun impact sur votre application: la livraison de réponses connues à des questions connues peut se faire via des proxy inverses.

Thomas Junk
la source
4
Si les données peuvent être mises en cache dans une couche de service de repos, elles peuvent être mises en cache dans l'application Web, ce qui serait bien meilleur pour les performances.
JacquesB
Le moyen le plus rapide est de ne pas utiliser l'application Web du tout.
Thomas Junk
1
Et juste pour le rendre plus intéressant, tous les "hits" de la base de données ne sont pas égaux si vous pouvez accéder en mémoire contre le disque.
JeffO
@ThomasJunk: Si je comprends bien la question d'origine, le client est une application Web et la question est de savoir si l'application Web doit se connecter directement à la base de données ou appeler via un service de repos.
JacquesB
1
Cela ne change rien à ma réponse. Appeler un service REST comprend appeler un serveur Web qui pourrait se trouver derrière un proxy inverse où les réponses possibles pourraient être mises en cache - comme je l'ai déjà dit.
Thomas Junk
2

L'introduction d'un niveau de service supplémentaire a toujours un coût en complexité et en surcoût de performance. Il existe certains types d'architecture spécifiques où l'introduction d'un niveau de service partagé (comme une API REST) ​​peut améliorer la force en raison de la mise en cache partagée - mais il semble que ce ne soit pas le type d'architecture que vous avez.

Considérez une architecture dans laquelle vous avez plusieurs applications Web ou plusieurs applications de bureau se connectant directement à la même base de données. S'ils effectuent souvent les mêmes requêtes, cela peut améliorer les performances de mise en cache des résultats de requête dans un service partagé. Surtout si vous avez dit que des centaines d'applications de bureau accédant directement à la même base de données (pas via une application Web!) Et effectuant les mêmes requêtes, il pourrait y avoir une amélioration majeure. Cependant, même dans cette architecture, la principale raison de l'introduction d'un service partagé serait probablement la sécurité et l'abstraction des données plutôt que les performances.

Mais il semble que vous ayez une seule application Web qui se connecte directement à la base de données. Dans ce cas, il n'y a aucun avantage à introduire une couche de service supplémentaire. La mise en cache, l'abstraction de la base de données, etc. peuvent être gérées au niveau de la couche d'accès aux données dans la même application.

JacquesB
la source
1

Ça dépend.

Évidemment, plus il y a de couches dans votre code, plus il ralentit. Mais ... il arrive un moment où les performances directes de bout en bout n'ont pas autant d'importance que l'évolutivité. Si vous avez 1 utilisateur accédant à votre base de données sur un PC local, cela peut aller vite. Si un millier d'utilisateurs accèdent à la même base de données sur le même PC, il est probable que vous les verrez tous frustrés. La solution consiste à déplacer la base de données vers une autre boîte, à ajouter une couche au milieu et bien que pour 1 utilisateur, elle fonctionnera plus lentement, lorsque des milliers y accèderont, elle ira plus vite. (c'est une réponse simpliste mais vraie en principe).

Il existe d'autres raisons de masquer votre base de données derrière une couche de niveau intermédiaire, comme la sécurité.

gbjbaanb
la source
-2

Je ne sais pas où vous vous perdez, mais il est assez clair que lorsque vous utilisez l'API REST, vous effectuez une étape supplémentaire, et l'étape supplémentaire "toujours" signifie plus lentement lors de la programmation.

Il y a des avantages et des inconvénients, mais si vous pouvez accéder à la base de données directement à partir de votre application, il vaut toujours mieux l'appeler directement au lieu d'utiliser l'API Web, bien sûr, si vous utilisez l'API Web, vous pouvez facilement porter votre application sur une plate-forme différente.

kirie
la source
1
"Je ne sais pas où vous vous perdez, mais il est assez clair que lorsque vous utilisez l'API REST, vous effectuez une étape supplémentaire, et l'étape supplémentaire" signifie "toujours plus lentement lors de la programmation." Si cela signifie une exécution plus lente, ce n'est pas correct.
Thomas Junk
1
N'y a-t-il pas des situations où l'accès à la base de données est une mauvaise idée en dehors de la portabilité? Parfois, avoir une API REST, etc. peut conserver plus de logique (et une meilleure sécurité?) Côté serveur, non?
J Trana
@JTrana qui peut être oui ou non, dépend vraiment de la façon dont vous faites les choses, tout en introduisant une couche supplémentaire peut fournir une couche de sécurité supplémentaire, l'ajout d'une couche supplémentaire signifie également que vous avez plus de chance de gâcher quelque chose et d'exposer le trou de sécurité. Je pense que le point de l'API Web est d'exposer votre "API". Les grandes applications comme Facebook, Amazon, Google qui doivent fournir un accès à des tiers et qui ont beaucoup de plate-forme doivent avoir une API Web, mais pour les petites applications, vous devez réfléchir à deux fois avant de le faire.
kirie
-2

DU REPOS :

  • ouvert à plusieurs frontends et 1 backend
  • besoin de créer votre propre API (ou en utiliser une comme Loopback)
  • ne fonctionne pas hors ligne

DB locale:

  • non ouverts aux «tiers», ils doivent avoir accès à votre backend pour se synchroniser
  • pas besoin de créer une API, utilisez l'interface DB
  • travailler hors ligne

C'EST UNE ÉNORME DIFFÉRENCE, LES PERSONNES OUBLIENT SOUVENT CES POINTS

Benjamin Fuentes
la source
2
-1. Bien qu'il ne soit pas "nécessaire" de créer une API, la non-création d'un DAL entraîne souvent d'énormes difficultés si un changement de backend de la base de données est nécessaire. Aucune raison non plus pour laquelle si vous avez la base de données "hors ligne", le service Rest ne pourrait pas y être mis à disposition.
James Snell