Die Geschwindigkeit der Facebook-Website zählt zu den wichtigsten Unternehmensaufgaben. Im Jahr 2009 gelang es uns, die Geschwindigkeit der Facebook-Website zu verdreifachen. Und es sind einige wichtige Innovationen unseres Ingenieurteams, die es möglich machen. In diesem Artikel stelle ich Ihnen eine unserer geheimen Soßen vor, die großartige zugrunde liegende Technologie, die wir BigPipe nennen.
BigPipe ist ein neu gestaltetes grundlegendes dynamisches Webdienstsystem. Die allgemeine Idee besteht darin, Webseiten in kleine Teile, sogenannte Pagelets, zu zerlegen und dann Pipelines über Webserver und Browser aufzubauen, um ihre Ausführung in verschiedenen Phasen zu verwalten. Dies ähnelt dem Pipeline-Ausführungsprozess der meisten modernen Mikroprozessoren: Mehrere Befehlspipelines durchlaufen verschiedene Prozessorausführungseinheiten, um eine optimale Leistung zu erzielen. Obwohl es sich bei BigPipe um eine Neugestaltung des bestehenden Service-Netzwerk-Infrastrukturprozesses handelt, sind keine Änderungen an vorhandenen Webbrowsern oder Servern erforderlich und die Implementierung erfolgt vollständig mit PHP und JavaScript.
Motivation
Um BigPipe besser zu verstehen, müssen wir einen Blick auf das bestehende dynamische Webdienstsystem werfen. Seine Geschichte lässt sich bis in die Anfänge des World Wide Web zurückverfolgen, aber jetzt hat es sich im Vergleich zu den Anfängen nicht wesentlich verändert. Moderne Websites verfügen über wesentlich dynamischere Effekte und Interaktivität als noch vor 10 Jahren, doch herkömmliche Webservice-Systeme können mit den heutigen Anforderungen an die Internetgeschwindigkeit schon lange nicht mehr mithalten. Im traditionellen Modell sieht der Lebenszyklus einer Benutzeranfrage wie folgt aus:
Das traditionelle Modell ist bei modernen Websites sehr ineffizient, da sich die Abläufe vieler Systeme nicht überschneiden können. Einige Optimierungstechniken wie das verzögerte Laden von JavaScript und das parallele Herunterladen wurden von der Online-Community weithin übernommen, um einige der Einschränkungen zu überwinden. Allerdings beheben diese Optimierungen selten den Engpass, der durch die Ausführungsreihenfolge des Webservers und Browsers verursacht wird. Während der Webserver damit beschäftigt ist, eine Seite zu erstellen, ist der Browser untätig und verschwendet seine Zyklen mit Nichtstun. Wenn der Webserver mit der Generierung der Seite fertig ist und sie an den Browser sendet, wird der Browser zum Leistungsengpass und der Webserver kann nicht helfen. Durch die Überlappung der Generierungszeit des Webservers und der Renderzeit des Browsers können wir nicht nur die endgültige Zeitverzögerung reduzieren, sondern auch ermöglichen, dass die Webseite dem Benutzer den für den Benutzer sichtbaren Bereich früher anzeigt, wodurch die Verzögerungswahrnehmung des Benutzers erheblich verringert wird.
Dies ist besonders nützlich für inhaltsreiche Websites wie Facebook, bei denen sich die Spawn-Zeit des Webservers mit der Rendering-Zeit des Browsers überschneidet. Eine typische Facebook-Webseite enthält Daten aus vielen verschiedenen Quellen: Freundesliste, Freundesaktualisierungen, Werbung usw. Im herkömmlichen Modus zum Rendern von Webseiten müsste der Benutzer warten, bis diese Abfragedaten zurückgegeben und die endgültige Datei generiert und dann an den Computer des Benutzers gesendet wird. Jede Abfrageverzögerung verlangsamt die gesamte endgültige Dateigenerierung.
So funktioniert BigPipe
Um die Parallelität zwischen dem Webserver und dem Browser auszunutzen, unterteilt BigPipe die Webseite zunächst in mehrere aufrufbare Pagelets. So wie ein Pipeline-Mikroprozessor den Lebenszyklus eines Befehls in mehrere Phasen unterteilt (z. B. „Befehlsabruf“, „Befehlsdekodierung“, „Ausführung“, „Zurückschreiben ins Register“ usw.), ist der Seitengenerierungsprozess von BigPipe unterteilt in die folgenden Phasen:
Quelle: isd