Mais est-ce vraiment important? Considérez que l'interface utilisateur doit effectuer un appel réseau à l'API; c'est assez gros (ordre de grandeur des millisecondes). Les bases de données sont optimisées pour garder les choses en mémoire et exécuter les lectures très, très rapidement (par exemple. SQL Server charge et conserve tout en RAM et consomme presque toute votre RAM libre si possible).
La logique
En théorie, vous avez raison. Cependant, cette justification présente quelques défauts:
D'après ce que vous avez déclaré, il n'est pas clair si vous avez réellement testé / profilé votre application. En d' autres termes, vous fait savoir que les transferts de réseau de l'application à l'API sont le composant le plus lent? Parce que c'est intuitif, il est facile de supposer que c'est le cas. Cependant, lorsque vous discutez des performances, vous ne devez jamais supposer. Chez mon employeur, je suis le responsable de la performance. Lorsque j'ai rejoint le groupe pour la première fois, les gens parlaient des CDN, de la réplication, etc. en fonction de leur intuition sur les goulots d'étranglement. Il s'avère que nos plus gros problèmes de performances étaient les requêtes de base de données peu performantes.
Vous dites que, parce que les bases de données sont bonnes pour récupérer des données, que la base de données fonctionne nécessairement à des performances optimales, est utilisée de manière optimale et rien ne peut être fait pour l'améliorer. En d'autres termes, les bases de données sont conçues pour être rapides, donc je ne devrais jamais avoir à m'en soucier. Une autre ligne de pensée dangereuse. C'est comme dire qu'une voiture est censée se déplacer rapidement, donc je n'ai pas besoin de changer l'huile.
Cette façon de penser suppose un seul processus à la fois, ou autrement dit, aucune concurrence. Il suppose qu'une demande ne peut pas influencer les performances d'une autre demande. Les ressources sont partagées, telles que les E / S de disque, la bande passante réseau, les pools de connexions, la mémoire, les cycles de processeur, etc. Par conséquent, la réduction de l'utilisation par un appel de base de données d'une ressource partagée peut l'empêcher de ralentir d'autres requêtes. Lorsque j'ai rejoint mon employeur actuel, la direction pensait que régler une requête de base de données de 3 secondes était une perte de temps. 3 secondes c'est si peu, pourquoi y perdre du temps? Ne serions-nous pas mieux avec un CDN ou une compression ou autre chose? Mais si je peux exécuter une requête de 3 secondes en 1 seconde, par exemple en ajoutant un index, c'est-à-dire 2/3 de blocage en moins, 2/3 de temps en moins pour occuper un thread, et plus important encore, moins de données lues sur le disque,
La théorie
Il est communément admis que la performance d'un logiciel est simplement une question de vitesse .
Du point de vue de la vitesse, vous avez raison. Un système n'est aussi rapide que son composant le plus lent. Si vous avez profilé votre code et constaté qu'Internet est le composant le plus lent, alors tout le reste n'est évidemment pas la partie la plus lente.
Cependant, étant donné ce qui précède, j'espère que vous pouvez voir comment la contention des ressources, le manque d'indexation, un code mal écrit, etc. peuvent créer des différences de performances surprenantes.
Les hypothèses
Une dernière chose. Vous avez mentionné qu'un appel à une base de données devrait être bon marché par rapport à un appel réseau de l'application à l'API. Mais vous avez également mentionné que l'application et les serveurs d'API se trouvent sur le même réseau local. Par conséquent, les deux ne sont-ils pas comparables aux appels réseau? En d'autres termes, pourquoi supposez-vous que le transfert d'API est beaucoup plus lent que le transfert de base de données alors qu'ils ont tous deux la même bande passante disponible? Bien sûr, les protocoles et les structures de données sont différents, je comprends, mais je conteste l'hypothèse selon laquelle ce sont des ordres de grandeur différents.
Où ça devient le murkey
Toute cette question concerne les appels de base de données "multiples" par rapport à "simples". Mais on ne sait pas combien sont multiples. En raison de ce que j'ai dit ci-dessus, en règle générale, je recommande de faire aussi peu d'appels de base de données que nécessaire. Mais ce n'est qu'une règle d'or.
Voici pourquoi:
- Les bases de données sont excellentes pour lire les données. Ce sont des moteurs de stockage. Cependant, votre logique métier réside dans votre application. Si vous établissez que chaque appel d'API entraîne exactement un appel de base de données, votre logique métier peut se retrouver dans la base de données. Peut-être que ça va. De nombreux systèmes le font. Mais certains ne le font pas. C'est une question de flexibilité.
- Parfois, pour obtenir un bon découplage, vous souhaitez séparer 2 appels de base de données. Par exemple, chaque demande HTTP est peut-être acheminée via un filtre de sécurité générique qui valide à partir de la base de données que l'utilisateur dispose des droits d'accès appropriés. Si tel est le cas, exécutez la fonction appropriée pour cette URL. Cette fonction peut interagir avec la base de données.
- Appel de la base de données en boucle. C'est pourquoi j'ai demandé combien est multiple. Dans l'exemple ci-dessus, vous auriez 2 appels de base de données. 2 est très bien. 3 peut être bien. N ne va pas bien. Si vous appelez la base de données dans une boucle, vous avez maintenant rendu les performances linéaires, ce qui signifie que cela prendra plus de temps en plus de l'entrée de la boucle. Donc, dire catégoriquement que le temps réseau d'API est le plus lent néglige complètement les anomalies comme 1% de votre trafic prenant beaucoup de temps en raison d'une boucle non encore découverte qui appelle la base de données 10000 fois.
- Parfois, votre application est meilleure, comme certains calculs complexes. Vous devrez peut-être lire certaines données de la base de données, faire des calculs, puis en fonction des résultats, passer un paramètre à un deuxième appel à la base de données (peut-être pour écrire des résultats). Si vous les combinez en un seul appel (comme une procédure stockée) juste pour appeler une seule fois la base de données, vous vous êtes forcé à utiliser la base de données pour quelque chose que le serveur d'application pourrait être meilleur.
- Équilibrage de charge: vous disposez d'une base de données (probablement) et de plusieurs serveurs d'applications à charge équilibrée. Par conséquent, plus l'application fait de travail et moins la base de données le fait, plus elle est évolutive, car il est généralement plus facile d'ajouter un serveur d'applications que de configurer la réplication de la base de données. Sur la base du point précédent, il peut être judicieux d'exécuter une requête SQL, puis de faire tous les calculs dans l'application, qui est répartie sur plusieurs serveurs, puis d'écrire les résultats lorsque vous avez terminé. Cela pourrait donner un meilleur débit (même si le temps de transaction global est le même).
TL; DR
TLDR: Est-il vraiment important de s'inquiéter de plusieurs appels de base de données alors que nous faisons déjà un appel réseau sur le LAN? Si oui, pourquoi?
Oui, mais seulement dans une certaine mesure. Vous devriez essayer de minimiser le nombre d'appels de base de données lorsque cela est possible, mais ne combinez pas les appels qui n'ont rien à voir les uns avec les autres uniquement dans le but de les combiner. Évitez également d'appeler la base de données en boucle à tout prix.