Ist es eine gute Idee, mehrere HTTP-Anforderungen zusammenzuführen, um Bandbreite zu sparen?

16

Ich bereite eine Anwendung für eine einzelne Seite vor, die manchmal über eine langsame mobile Verbindung verwendet wird. Einige seiner Teile sind in Bezug auf API-Anforderungen ziemlich umfangreich (Abrufen von zehn verschiedenen Ressourcen für eine neue Bildschirmanzeige).

Ist es nun eine gute Idee, diese Dienste zu einem zusammenzuführen, der alle erforderlichen Daten bereitstellt, jedoch nicht so "rein" im Sinne der REST-Prinzipien ist? Sind erhebliche Leistungssteigerungen zu erwarten?

Lukáš Lánský
quelle
3
Die "gute Idee" ist diejenige, die die Leistungs- und Wartbarkeitsanforderungen Ihrer Software angemessen erfüllt.
Robert Harvey
1
Der Vorteil des Kombinierens von Antworten ist möglicherweise gar nicht so groß, obwohl Sie sicherstellen, dass ein Keep-Alive verwendet wird und Anforderungen, die parallel geladen werden können, geladen werden, ohne sich gegenseitig zu blockieren. Messen, messen, messen. Rate nicht
Lie Ryan
Wenn Sie dies tun, sparen Sie nicht nur Bandbreite, sondern können auch die E / A-Vorgänge neu anordnen, um die E / A-Leistung zu verbessern. Dies ist häufig ein Flaschenhals in einem System und verbessert den Durchsatz enorm.
InformedA

Antworten:

18

Einer der Vorteile von REST ist die Möglichkeit, Anforderungen über herkömmliche http-Caches zwischenzuspeichern (vorausgesetzt, es handelt sich um zwischenspeicherbare Anforderungen).

Wenn Sie einzelne, größere, weniger häufig verwendete und möglicherweise unterschiedliche Anforderungen haben (ich werde a,b,c,ddieses Mal Elemente und das a,b,d,enächste Mal Elemente abrufen), ist es wahrscheinlicher, dass die Anforderung ein Cache-Fehler ist und aus einem möglicherweise abgelaufenen Cache-Speicher abläuft irgendwo zwischen dir und der Quelle sitzen.

In Anbetracht der beiden oben genannten Anforderungssätze kann die zweite Anforderung eine Cache- Trefferrate von 75% aufweisen und das Abrufen nur wesentlich schneller sein eals bei allen vier Dingen.

Beachten Sie, dass dies für Personen, die es als Person verwenden, die den ersten Satz von Cache-Fehlanfragen ausführt, möglicherweise nicht sofort ersichtlich ist, dass die Cache-Fehlanfragen weiterhin vorhanden sind.

Dies soll nicht heißen, dass dies ideal für eine mobile Netzwerkverbindung ist, bei der es weniger wahrscheinlich ist, dass nicht lokale Cachetreffer auftreten. Aber für Hot Spots oder andere WiFi-Situationen könnten die Cache-Treffer viel nützlicher sein.

Ein Großteil davon hängt wiederum davon ab, wie Ihre Anwendung funktioniert. Wird beim Start nach all diesen Daten gefragt? Oder handelt es sich um eine Seitenladung, bei der die Erwartungen an die Antwortzeit unterschiedlich sind?

Am besten testen Sie dies, um zu sehen, wie sich Ihre Anwendung in einer Vielzahl von Situationen verhält. Erwägen Sie, eine Situation einzurichten, in der Sie Ihr Mobilgerät an ein lokales WLAN-Netzwerk gebunden haben, das Sie überwachen können (dies ist nur der erste Treffer bei Google), und eine schlechte Internetverbindung zu simulieren, um festzustellen , wie die Dinge tatsächlich funktionieren (oder nicht). und welche hat die beste leistung.

Gemeinschaft
quelle
1
+1 für die Erwähnung von Caching. Je mehr Ressourcen Sie für eine Anforderung benötigen, desto höher ist die Wahrscheinlichkeit eines Cache-Ausfalls, desto geringer ist jedoch der HTTP-Overhead.
Brandon
8

Ihre Intuition ist im Großen und Ganzen einigermaßen korrekt. Es ist sicherlich vorzuziehen, weniger Anfragen zu stellen. Chunky-APIs sind in der Regel besser. Vor allem bei punktuellen Konnektivitätsproblemen, bei denen einige Probleme auftreten und andere nicht zu alptraumhaften Ausfallszenarien führen, da sich nichts auf irgendetwas stützen kann.

Es gibt eine große Einschränkung - Sie können viel zu klobig werden und Ihre Anrufe und Antworten werden aufgebläht. Zum Beispiel kann es sinnvoll sein, einen großen Anruf zu tätigen, wenn Sie zum ersten Mal eine Seite aufrufen und dann Aktualisierungen in kleineren Schritten einspielen, anstatt jedes Mal eine große Seitenaktualisierung zu erzwingen, wenn Sie Daten benötigen.

Oder Sie werden es höchstwahrscheinlich in beide Richtungen tun wollen.

Wyatt Barnett
quelle
5

Lesen Sie diesen Dropbox Tech Blog-Artikel .

Dort wird detailliert beschrieben, warum und wie genau die von Ihnen vorgeschlagene Lösung implementiert wurde, um die Miniaturansichten für alle Ihre Bilder abzurufen. Es sollte gesagt werden, dass sie die Leistung messen, um zu sehen, ob es die Mühe wert ist, und anscheinend ist es das auch.

Kurze Zusammenfassung:

Die Dropbox-Website muss Hunderte von Thumbnails laden. Aufgrund von Einschränkungen in einigen Browsern werden nicht alle Miniaturansichten gleichzeitig geladen (die Anforderungen werden in die Warteschlange gestellt). Sie wollten SPDY verwenden , konnten dies jedoch nicht, da Teile ihres Systems dies noch nicht unterstützen. Am Ende verwendeten sie Stapelanforderungen über HTTP, die mehrere Miniaturansichten pro Antwort in komprimierter Form zurückgeben. Die Gesamtverbesserung der Seitenladezeit betrug laut ihren Ergebnissen 40%.

jmiserez
quelle
Aber sie sagen, es ist eine vorübergehende Lösung.
Ymajoros
3

Zusamenfassend: Ihr Ansatz ist etwas korrekt und könnte von einem Wrapper-Service profitieren.

Dieser Dienst kombiniert vorhandene Einzelanrufe zu einer dienstseitigen Methode. Kombinieren Sie dazu die Anrufe vom Client zur Serviceseite und nutzen Sie alle einzelnen, atomaren, erholsamen Anrufe, die Sie wahrscheinlich bereits getätigt haben.

Sie würden also weiterhin von REST profitieren, da die Anforderungen zwischengespeichert werden können.

Am Ende kommt es jedoch auf die Leistung der Service- / Server-Infrastruktur und die Client-Umgebung an, die diese verbrauchen soll.

Yusubov
quelle