Heim  >  Artikel  >  Backend-Entwicklung  >  Architekturanalyse von Swoole

Architekturanalyse von Swoole

不言
不言Original
2018-08-06 10:13:382794Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Architekturanalyse von Swoole. Er hat einen gewissen Referenzwert. Ich hoffe, dass er für Sie hilfreich ist.

Das Strukturdiagramm sieht wie folgt aus:

Swoole wird hauptsächlich vom Master-Prozess (Hauptprozess) und dem Manager-Prozess zur Vervollständigung verwendet Funktionen.

Master-Prozess

ist ein Multithread-Programm. Es gibt eine sehr wichtige Gruppe von Threads, die als Reaktor-Threads bezeichnet werden. Es ist der Thread, der tatsächlich TCP-Verbindungen verarbeitet und Daten sendet und empfängt.

Manager-Prozess

verwaltet Arbeiter-/Aufgabenprozesse. Die Worker-/Aufgabenprozesse werden alle vom Manager-Prozess geforkt und verwaltet.

Reactor-Thread

Nach dem Akzeptieren einer neuen Verbindung weist der Hauptthread (Master-Prozess) die Verbindung einem festen Reactor-Thread zu, und dieser Thread ist für die Überwachung des Sockets verantwortlich. Lesen Sie die Daten, wenn der Socket lesbar ist, führen Sie eine Protokollanalyse durch und übermitteln Sie die Anfrage an den Worker-Prozess.

  • ist verantwortlich für die Aufrechterhaltung der Client-TCP-Verbindungen, die Verarbeitung des Netzwerks IO, die Verarbeitung von Protokollen, das Senden und Empfangen von Daten

  • ist vollständig asynchroner, nicht blockierender Modus

  • besteht ausschließlich aus C Code, mit Ausnahme von Start/Shudown Ereignisrückrufen wird kein PHP-Code ausgeführt

  • Puffern, spleißen und teilen Sie die vom TCP Client gesendeten Daten in ein vollständiges Anforderungspaket auf.

  • ReactorAuf Multithread-Weise ausführen

Arbeitsprozess

ähnelt dem PHP-FPM-Prozess.

  • Akzeptiert das vom Reactor-Thread übermittelte Anforderungspaket und führt die PHPRückruffunktion aus, um die Daten zu verarbeiten.

  • erzeugt eine Antwort Daten und sendet sie an den Reactor Thread, der vom Reactor Thread an den TCP Client gesendet wird

  • kann im asynchronen Modus oder im synchronen Modus

  • Im Multiprozessmodus ausführenWorker

TaskWorker-Prozess

Ein Prozess, der andere Aufgaben asynchron abwickelt. Die Verwendungsmethode ähnelt Gearman.

  • Akzeptiert die vom

    -Prozess über die Worker-Methode gelieferte Aufgabe swoole_server->task/taskwait

  • verarbeitet die Aufgabe und gibt die Ergebnisdaten zurück (

    ) sorgt dafür, dass der swoole_server->finish Prozess Worker

  • in einer Mehrprozessweise ausgeführt wird TaskWorker

Die Beziehung

kann so verstanden werden, dass

Reactor ist, nginx ist Worker. Der php-fpm-Thread verarbeitet die Netzwerkanforderung asynchron und parallel und leitet sie dann zur Verarbeitung an den Reactor-Prozess weiter (verarbeitet in der Rückruffunktion). Die Kommunikation zwischen Worker und Reactor erfolgt über Worker. UnixSocket

Ereignisverarbeitungsprozess

Um den Swoole-Ereignisverarbeitungsprozess zu verstehen, verstehen Sie zunächst die beiden Netzwerkereignisverarbeitungsmodi.

Reaktormodus

Es erfordert, dass der Hauptthread (E/A-Verarbeitungseinheit) nur überwacht, ob ein Ereignis im Dateideskriptor auftritt, und wenn ja, den Arbeitsthread/-prozess sofort darüber benachrichtigt das Ereignis (logische Einheit). Ansonsten erledigt der Hauptthread keine andere Arbeit. Das Lesen und Schreiben von Daten, das Annehmen neuer Verbindungen und die Bearbeitung von Kundenanfragen erfolgen allesamt in Worker-Threads.

Proactor-Modus

Zwei Implementierungen

Verwenden Sie das asynchrone E/A-Modell, um den Proactor-Modus zu implementieren. Prinzip: Alle E/A-Operationen werden an den Hauptthread übergeben, der mit dem Kernel zusammenarbeitet, um sie zu verarbeiten, und Geschäftslogikoperationen werden an die Logikeinheit übergeben. Verwenden Sie dazu beispielsweise aio_read.

Workflow:

  1. Der Hauptthread ruft die Funktion aio_read auf, um das Leseabschlussereignis auf dem Socket beim Kernel zu registrieren.

  2. Der Hauptthread verarbeitet weiterhin andere E/A-Ereignisse.

  3. Wenn die Daten am Socket in den Benutzerpuffer eingelesen werden, sendet der Kernel ein Signal an die Anwendung (logische Einheit), um die Anwendung darüber zu informieren, dass die Daten verfügbar sind.

  4. Die Anwendung liest die Daten (Client-Anfrage) und ruft nach der Verarbeitung die Funktion aio_write auf, um das Schreibereignis auf dem Socket beim Kernel zu registrieren.

  5. Der Hauptthread verarbeitet weiterhin andere Logik.

  6. Wenn die Daten im Benutzerpuffer in den Socket geschrieben werden, sendet der Kernel ein Signal an die Anwendung, um die Anwendung darüber zu informieren, dass die Daten gesendet wurden.

  7. Die Anwendung verfügt über vordefinierte Signalverarbeitungsfunktionen, um die Folgen zu bewältigen, wie z. B. das Schließen des Sockets.

Verwenden Sie die E/A-Synchronisierung Modell zur Implementierung des Proactor-Modells. Prinzip: Der Hauptthread führt die Lese- und Schreibvorgänge für E/A-Ereignisdaten aus und die Geschäftslogikoperationen werden an die Logikeinheit übergeben. Verwenden Sie dazu beispielsweise epoll.

Workflow:

  1. Der Hauptthread registriert das Lesebereitschaftsereignis am Socket in der Epoll-Kernel-Ereignistabelle.

  2. Der Hauptthread ruft epoll_wait auf, um darauf zu warten, dass Daten auf dem Socket gelesen werden.

  3. Nach der Rückkehr von epoll_wait liest der Hauptthread Daten aus dem Socket, kapselt die gelesenen Daten dann in ein Anforderungsobjekt (Client-Anfrage) und fügt sie in die Anforderungswarteschlange ein.

  4. Dann verarbeitet der Verbraucherthread der Warteschlange das Anforderungsobjekt und registriert dann das Schreibbereitschaftsereignis am Socket in der Epoll-Kernel-Ereignistabelle.

  5. Der Hauptthread ruft epoll_wait auf, um darauf zu warten, dass der Socket beschreibbar ist.

  6. Wenn der Socket beschreibbar ist, benachrichtigt epoll_wait den Hauptthread. Der Hauptthread schreibt das Anfrageergebnis in den Socket.

Swoole-Ereignisarchitekturdiagramm

Wie aus der Abbildung ersichtlich ist, wenn wir den Reaktor-Thread und den Arbeitsprozess kombinieren, Es kann wie folgt angesehen werden: Für Arbeitsthreads verwendet Swoole den Reaktorereignisverarbeitungsmodus.

Die Schritte, die eine Anfrage durchläuft, sind wie folgt:

1. Der Server-Hauptthread wartet darauf, dass der Client eine Verbindung herstellt.

2. Der Reactor-Thread verarbeitet den verbundenen Socket, liest die Anfragedaten auf dem Socket (Receive), kapselt die Anfrage und liefert sie an den Arbeitsprozess.

3. Der Arbeitsprozess ist eine logische Einheit, die Geschäftsdaten verarbeitet.

4. Das Ergebnis des Arbeitsprozesses wird an den Reactor-Thread zurückgegeben.

5. Der Reactor-Thread schreibt das Ergebnis zurück in den Socket (Senden).

Bitte lesen Sie die obige strukturelle Einführung für die Arbeit jedes Moduls.

Verwandte Empfehlungen:

Wie passe ich ein Modell an? Verwendung des benutzerdefinierten ThinkPHP3.2-Basisklassenmodells

So verwenden Sie PHP, um den Inhalt von Excel-Dateien zu lesen und Zelldaten zu erhalten

Das obige ist der detaillierte Inhalt vonArchitekturanalyse von Swoole. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn