web-dev-qa-db-fra.com

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

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 OR interroger votre directement (c'est-à-dire en utilisant 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. Code à l'intérieur de votre 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? Cela dépend peut-être du type de base de données (SQL vs NoSQL)?

17
Micro

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.

19
Klee

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), maintenant REST est très attrayant 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 cela dépend , mais j'espère que je vous ai donné quelques pistes de réflexion!

9
Romski

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. Code à l'intérieur de votre REST API 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 provient du fait que vous ne comprenez pas complètement REST et ses principes. REST n'a pas été inventé, car certains nerds l'ont trouvé cool (de bien sûr, il est) d'envoyer des objets Javascript via HTTP sur le fil. Le principal avantage de l'utilisation de HTTP est la possibilité d'utiliser Caching . Si vous rendez vos résultats cachables , il y a donc moins de demandes à faire à la base de données. Et aucun triage n'est impliqué. La réponse pourrait être livré directement.

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

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 fourniture de réponses connues à des questions connues peut se faire via des proxy inverses.

8
Thomas Junk

L'introduction d'un niveau de service supplémentaire a toujours un coût en termes de complexité et de surcharge de performances. 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.

Imaginez 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.

2
JacquesB

Ç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ède à 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é.

1
gbjbaanb