Aber ist das wirklich wichtig? Bedenken Sie, dass die Benutzeroberfläche einen Netzwerkaufruf an die API durchführen muss. das ist ziemlich groß (Größenordnung von Millisekunden). Datenbanken sind optimiert, um den Arbeitsspeicher zu erhalten und Lesevorgänge sehr, sehr schnell auszuführen (z. B. SQL Server lädt und speichert alles im Arbeitsspeicher und belegt fast den gesamten freien Arbeitsspeicher, wenn dies möglich ist).
Die Logik
Theoretisch hast du recht. Es gibt jedoch ein paar Fehler mit dieser Begründung:
Nach Ihren Angaben ist nicht klar, ob Sie Ihre App tatsächlich getestet / profiliert haben. Mit anderen Worten, wissen Sie tatsächlich , dass die Netzwerkübertragungen von der App zur API die langsamste Komponente sind? Da dies intuitiv ist, ist es leicht anzunehmen, dass dies der Fall ist. Wenn Sie jedoch über die Leistung sprechen, sollten Sie niemals davon ausgehen. Bei meinem Arbeitgeber bin ich der Leistungsführer. Als ich anfing, redeten die Leute über CDNs, Replikation usw., basierend auf der Intuition darüber, was die Engpässe sein müssen. Es stellte sich heraus, dass unsere größten Leistungsprobleme darin bestanden, Datenbankabfragen schlecht durchzuführen.
Sie sagen, dass, weil Datenbanken Daten gut abrufen können, die Datenbank notwendigerweise mit maximaler Leistung ausgeführt wird, optimal genutzt wird und nichts getan werden kann, um sie zu verbessern. Mit anderen Worten, Datenbanken sind so konzipiert, dass sie schnell sind, sodass ich mir darüber keine Sorgen machen sollte. Eine weitere gefährliche Denkrichtung. Das ist, als würde man sagen, ein Auto soll sich schnell bewegen, damit ich das Öl nicht wechseln muss.
Diese Denkweise geht von einem einzelnen Prozess aus, oder anders ausgedrückt, von keiner Nebenläufigkeit. Es wird davon ausgegangen, dass eine Anforderung die Leistung einer anderen Anforderung nicht beeinflussen kann. Ressourcen werden gemeinsam genutzt, z. B. Festplatten-E / A, Netzwerkbandbreite, Verbindungspools, Arbeitsspeicher, CPU-Zyklen usw. Daher kann die Reduzierung der Nutzung einer gemeinsam genutzten Ressource durch einen Datenbankaufruf verhindern, dass andere Anforderungen verlangsamt werden. Als ich zum ersten Mal zu meinem derzeitigen Arbeitgeber kam, war das Management der Ansicht, dass die Optimierung einer Datenbankabfrage von 3 Sekunden Zeitverschwendung war. 3 Sekunden sind so wenig, warum Zeit darauf verschwenden? Wären wir mit einem CDN oder einer Komprimierung oder etwas anderem nicht besser dran? Wenn ich jedoch eine 3-Sekunden-Abfrage in 1 Sekunde ausführen kann, indem ich beispielsweise einen Index hinzufüge, der 2/3 weniger blockiert, 2/3 weniger Zeit für das Besetzen eines Threads benötigt und vor allem weniger Daten von der Festplatte liest,
Die Theorie
Es gibt eine verbreitete Vorstellung, dass es bei der Software-Leistung einfach um Geschwindigkeit geht .
Sie haben aus reiner Geschwindigkeitsperspektive Recht. Ein System ist nur so schnell wie seine langsamste Komponente. Wenn Sie Ihren Code profiliert haben und festgestellt haben, dass das Internet die langsamste Komponente ist, ist alles andere offensichtlich nicht der langsamste Teil.
Ich hoffe jedoch, dass Sie in Anbetracht der obigen Ausführungen sehen können, wie Ressourcenkonflikte, mangelnde Indizierung, schlecht geschriebener Code usw. zu überraschenden Leistungsunterschieden führen können.
Die Annahmen
Eine letzte Sache. Sie erwähnten, dass ein Datenbankaufruf im Vergleich zu einem Netzwerkaufruf von der App zur API günstig sein sollte. Sie haben aber auch erwähnt, dass sich die App und die API-Server im selben LAN befinden. Sind sie also nicht beide vergleichbar mit Netzanrufen? Mit anderen Worten, warum nehmen Sie an, dass die API-Übertragung um Größenordnungen langsamer ist als die Datenbankübertragung, wenn beide dieselbe verfügbare Bandbreite haben? Natürlich sind die Protokolle und Datenstrukturen unterschiedlich, das verstehe ich, aber ich bestreite die Annahme, dass es sich um Größenordnungen handelt, die sich unterscheiden.
Wo es Murkey bekommt
Bei dieser ganzen Frage geht es um "mehrere" oder "einzelne" Datenbankaufrufe. Es ist jedoch unklar, wie viele mehrere sind. Aufgrund der oben genannten allgemeinen Faustregel empfehle ich, so wenig Datenbankaufrufe wie nötig durchzuführen. Das ist aber nur eine Faustregel.
Hier ist warum:
- Datenbanken eignen sich hervorragend zum Lesen von Daten. Sie sind Speichermaschinen. Ihre Geschäftslogik lebt jedoch in Ihrer Anwendung. Wenn Sie die Regel festlegen, dass jeder API-Aufruf genau zu einem Datenbankaufruf führt, wird Ihre Geschäftslogik möglicherweise in der Datenbank gespeichert. Vielleicht ist das in Ordnung. Das machen viele Systeme. Aber manche nicht. Es geht um Flexibilität.
- Manchmal möchten Sie, um eine gute Entkopplung zu erzielen, zwei Datenbankaufrufe getrennt haben. Beispielsweise wird möglicherweise jede HTTP-Anforderung durch einen generischen Sicherheitsfilter geleitet, der aus der Datenbank überprüft, ob der Benutzer über die richtigen Zugriffsrechte verfügt. Wenn dies der Fall ist, führen Sie die entsprechende Funktion für diese URL aus. Diese Funktion kann mit der Datenbank interagieren.
- Aufruf der Datenbank in einer Schleife. Deshalb habe ich gefragt, wie viele mehrere sind. Im obigen Beispiel hätten Sie 2 Datenbankaufrufe. 2 ist in Ordnung. 3 kann gut sein. N ist nicht in Ordnung. Wenn Sie die Datenbank in einer Schleife aufrufen, haben Sie die Leistung jetzt linearisiert. Dies bedeutet, dass die Eingabe in der Schleife umso länger dauert. Wenn Sie also kategorisch sagen, dass die API-Netzwerkzeit die langsamste ist, übersehen Sie Anomalien wie 1% Ihres Datenverkehrs, die aufgrund einer noch nicht entdeckten Schleife, die die Datenbank 10.000 Mal aufruft, sehr lange.
- Manchmal gibt es Dinge, in denen Ihre App besser ist, wie zum Beispiel komplexe Berechnungen. Möglicherweise müssen Sie einige Daten aus der Datenbank lesen, einige Berechnungen durchführen und dann basierend auf den Ergebnissen einen Parameter an einen zweiten Datenbankaufruf übergeben (möglicherweise, um einige Ergebnisse zu schreiben). Wenn Sie diese zu einem einzigen Aufruf zusammenfassen (wie bei einer gespeicherten Prozedur), nur um die Datenbank nur einmal aufzurufen, müssen Sie die Datenbank für etwas verwenden, das der App-Server möglicherweise besser kann.
- Lastenausgleich: Sie haben (vermutlich) 1 Datenbank und mehrere Anwendungsserver mit Lastenausgleich. Je mehr Arbeit die App leistet und je weniger die Datenbank leistet, desto einfacher ist die Skalierung, da es im Allgemeinen einfacher ist, einen App-Server hinzuzufügen, als die Datenbankreplikation einzurichten. Basierend auf dem vorherigen Aufzählungspunkt kann es sinnvoll sein, eine SQL-Abfrage auszuführen, dann alle Berechnungen in der Anwendung durchzuführen, die auf mehrere Server verteilt ist, und anschließend die Ergebnisse zu schreiben. Dies kann zu einem besseren Durchsatz führen (auch wenn die gesamte Transaktionszeit gleich ist).
TL; DR
TLDR: Ist es wirklich wichtig, sich über mehrere Datenbankaufrufe Gedanken zu machen, wenn wir bereits einen Netzwerkanruf über das LAN tätigen? Wenn ja warum?
Ja, aber nur bis zu einem gewissen Grad. Sie sollten versuchen, die Anzahl der Datenbankaufrufe zu minimieren, wenn dies sinnvoll ist. Kombinieren Sie jedoch keine Aufrufe, die nichts miteinander zu tun haben, nur um sie zu kombinieren. Vermeiden Sie außerdem, die Datenbank unter allen Umständen in einer Schleife aufzurufen.