1. Die Zielgruppe ansprechen
Wenn die Site-Architektur die folgenden Punkte erfüllt, ist der Optimierungsplan in diesem Artikel sehr gut geeignet:
1) Verwenden Sie Skriptsprachen wie PHP als Entwicklungssprache
2) Es muss eine Verbindung zu Back-End-Diensten wie RPC-Dienst, Memcache oder Redis usw. hergestellt werden.
3) Der Datenverkehr ist sehr groß
2. Zu lösende Probleme
Die übliche Webarchitektur ist wie oben:
1) Das Frontend ist die APP oder Webseite
2) Die obere Schicht des Servers ist der Webserver für den Zugriff
3) Die PHP-Skriptsprache ruft Back-End-Daten auf, vervollständigt die Geschäftslogik und verbindet Seiten
4) Das letzte Ende sind Dienste, Caches und Datenbanken
PHP ist im Gegensatz zu C/Java eine Skriptsprache. Der Prozess kann resident sein, sodass er kurze Verbindungen verwendet, um eine Verbindung zu Back-End-Diensten herzustellen:
Das Bild oben ist ein typisches Szenario. Die Site-PHP wird auf Maschine A bereitgestellt und auf Maschine B zwischengespeichert. Der Prozess ist:
1) PHP stellt eine TCP-Kurzverbindung her
2) Daten gemäß dem Memcache-Protokoll senden
3) Empfangen der vom Memcache zurückgegebenen Daten
4) PHP schließt den TCP kurze Verbindung
Wenn der Site-Verkehr gering ist, gibt es mit dem oben genannten Prozess kein Problem. Wenn der Site-Verkehr sehr groß und die QPS sehr hoch sind, wird PHP den TCP-Overhead beim Einrichten und Schließen von TCP kurz machen Es kann nicht ignoriert werden, dass es zu einem Leistungsengpass kommt. Wie man es optimiert, ist der Kern dieses Artikels.
3. Einführung in UNIX Domain Socket
Wechseln wir das Thema und werfen wir einen Blick auf die UNIX Domain Socket-Technologie.
UNIX Domain Socket ist ein IPC-Kommunikationsmechanismus zwischen Prozessen. Er muss nicht den Netzwerkprotokollstapel durchlaufen, keine Prüfsummen berechnen, keine Sequenznummern und Antworten usw. verwalten Überträgt lediglich Anwendungsschichtdaten von einem Prozess und kopiert sie in einen anderen Prozess. Es kann für zwei unabhängige Prozesse auf demselben Host verwendet werden und ist Vollduplex und bietet einen IPC-Mechanismus für eine zuverlässige Nachrichtenübermittlung (Nachrichten gehen nicht verloren, werden nicht wiederholt oder verwechselt).
4. Optimierungsplan
Es ist ersichtlich, dass die Effizienz von UNIX Domain Socket viel höher ist als die von TCP-Kurzverbindungen, es kann jedoch nur für die Prozesskommunikation zwischen denselben verwendet werden Host- und PHP-Anwendungen sowie Back-End-Dienste werden häufig auf verschiedenen Computern bereitgestellt. Können wir sie derzeit zur Optimierung verwenden?
Das vereinfachte Architekturdiagramm ist wie oben. Ein lokaler Proxy wird auf dem PHP-Anwendungsserver bereitgestellt und für die Kommunikation zwischen PHP und lokalem Proxy verwendet lokal – Der Proxy kommuniziert mit dem Back-End-Dienst über lange TCP-Verbindungen, was die Kommunikationseffizienz erheblich verbessert und den Aufwand für das Einrichten und Schließen kurzer TCP-Verbindungen für jede Anforderung eliminiert.
Wichtige Punkte von Local-Proxy
Um den oben genannten Optimierungsplan umzusetzen, ist Local-Proxy der Schlüsselpunkt. Bei der Implementierung von Local-Proxy müssen mehrere Punkte beachtet werden Achtung
1) Protokolldesign: Local-Proxy selbst verfügt über keine Geschäftslogik und ist nur für die Weiterleitung von Anfragen verantwortlich. Der Upstream sendet das Memcache-Protokoll transparent an den Back-End-Memcache In diesem Fall muss der Upstream-Client keine Codeänderungen vornehmen
2) Kommunikationsmethode: Wie oben erwähnt, verwendet der lokale Proxy den UNIX-Domänen-Socket, um mit dem Upstream zu kommunizieren, und verwendet eine lange TCP-Verbindung, um mit dem zu kommunizieren Downstream
3) Effizientes Framework: Diese Lösung besteht darin, das Problem der kurzen TCP-Verbindung zu lösen. Der Effizienzverlust der Verbindung bedeutet, dass die Effizienzanforderungen für lokale Proxys sehr hoch sind. Sie können ausgereifte und effiziente Netzwerk-Frameworks verwenden (wie z. B. libevent) und TCP-Verbindungspooltechnologie für lange Verbindungen, um
4) Anforderungszuordnung zu erreichen: Sie müssen Anforderungen, die vom Upstream gesendet werden, und Anforderungen, die an den Downstream gesendet werden, einzeln zuordnen, sodass die Upstream-Anforderung Paket und Antwortpaket können korrekt zugeordnet werden