Bei einer von mir entwickelten Webanwendung hatten wir ein Problem mit der Leistung. Nach einer kleinen Untersuchung fanden wir heraus, dass es mit der Anzahl der Anfragen an den Server zu tun hatte, die durchgeführt wurden.
Die Anwendung läuft in einem Browser (derzeit IE7) und Browser sind im Allgemeinen darauf beschränkt, nicht mehr als 2 parallele Anfragen an dieselbe Domain zu stellen (dies hat sich in späteren Versionen der Browser etwas verbessert). In diesem Beitrag werde ich die Suche nach Lösungen beschreiben.
Eine vereinfachte Beschreibung der Anwendung wird Ihnen helfen, das Problem besser zu verstehen, denke ich. Die Anwendung wird verwendet, um die Bewegungen von Autos im ganzen Land zu verfolgen. Daher werden alle N Sekunden mit Hilfe von XMLHttpRequest eine Menge Daten gesammelt. Für jeden Fahrzeugtyp wird eine eigene Anfrage an den Server gestellt. Derzeit werden alle 5 Sekunden etwa 5 Anfragen gestellt.
Das Problem wäre nicht aufgefallen, wenn alle Abfragen gut gelaufen wären und jede Abfrage weniger als 1 Sekunde gedauert hätte, aber eine der Abfragen war mit einer Antwortzeit von über 20 Sekunden sehr langsam. Diese Abfrage wurde in 2 der 5 Abfragen verwendet. Außerdem war die App so aufgebaut, dass die aktuelle Abfrage abgebrochen wurde, wenn eine neue Abfrage ausgelöst wurde. Das Problem war also, dass mindestens eine der 2 parallelen Abfragen nie eine Antwort liefern konnte und andere Abfragen aufhielt.
Subdomänen verwenden
Selbst nach der Verbesserung der Abfrageleistung war es also notwendig, mehr als 2 parallele Abfragen gleichzeitig durchzuführen, um die Dinge noch weiter zu beschleunigen. Für normale http-Anfragen besteht eine weit verbreitete Lösung darin, Subdomains in Ihrem DNS-Server einzurichten, die auf dieselbe Domain verweisen, so dass der Browser glaubt, die Anfrage sei an eine andere Domain gerichtet. Diese Technik wird z.B. bei Google Maps verwendet, um die Bilder von mehreren Domains zu beziehen und so eine schnellere Benutzererfahrung zu ermöglichen.
Ich wollte die gleiche Art von Funktionalität für meine XMLHttpRequests implementieren, also ging ich los und implementierte eine Lösung, um eine Subdomain aus einem Array auszuwählen und die Anfrage dorthin zu senden. Leider funktionierte dies aufgrund der Sicherheitseinschränkungen für domänenübergreifende XMLHttpRequest nicht. Auch wenn ich besser als der Browser weiß, dass diese Subdomain im Grunde dieselbe Domain ist, schränkte mich der Browser hier ein. Das hat man davon, wenn man den Browser austrickst, um mehr parallel zu tun, nicht wahr?
Bei der weiteren Suche fand ich alle möglichen Workaround-Lösungen, die Frames und ähnliches verwenden, um domänenübergreifende XMLHttpRequests auszuführen, aber die nützlichste Lösung war auf die neuere Generation von Browsern (Firefox 3.5+, IE8 usw.) beschränkt.
Antwort-Header Access-Control-Allow-Origin verwenden
Wenn Sie den Antwort-Header Access-control-Allow-Origin auf den exakten Wert (einschließlich https://) des Ursprungs setzen, von dem Ihre Webanwendung geladen wird, ist es möglich, domänenübergreifende XMLHttpRequests zu erstellen. Am einfachsten habe ich dies implementiert, indem ich das Modul headers_module (modules/mod_headers.so) in meine Apache http.conf geladen und die folgende Zeile in die Konfigurationsdatei eingefügt habe:
Header immer eingestellt Access-Control-Allow-Origin: https://maindomain.sample.org
.csharpcode, .csharpcode pre { Schriftgröße: klein; Farbe: Schwarz; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /Leerzeichen: vor;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; Breite: 100%; Rand: 0em; } .csharpcode .lnum { color: #606060; }
Dies veranlasste den Browser, beim Aufruf von XMLHttpRequest.open eine OPTION-Anfrage zu senden, um zu prüfen, ob der Aufruf erlaubt war, bevor die Daten mit der POST-Anfrage gesendet wurden.
Und was ist mit den älteren Browsern?
Aber er! Ich arbeite immer noch mit dem IE7, oder? Richtig, also zurück zum Reißbrett.
Daher versuche ich derzeit, so viele Anfragen wie möglich in einer einzigen Anfrage zusammenzufassen und die Daten bei der Rückkehr herauszufiltern. In der Zwischenzeit habe ich herausgefunden, dass Sie für den IE die Anzahl der parallelen Anfragen an dieselbe Domäne durch eine Anpassung der Registrierungseinstellungen beeinflussen können. Da die Anwendung in einer geschlossenen und kontrollierten Umgebung läuft, könnte dies der richtige Weg sein, wenn meine Programmierversuche erfolglos bleiben.
Verfasst von
Kris Geusebroek
Unsere Ideen
Weitere Blogs
Contact


