Wie wir alle wissen, werden Sie beim Entwerfen einer Website auf „Gruppen-Textnachrichten“ an Benutzer, „eine große Anzahl von Protokollen im Bestellsystem“ und „Flash-Sale-Design“ stoßen. usw. Der Server kann damit nicht umgehen. Diese Art von sofortigem Druckanstieg erfordert die Hilfe einer „Nachrichtenwarteschlange“, um die normale und effektive Nutzung des Systems sicherzustellen. In diesem Artikel wird hauptsächlich die Idee der Nachrichtenwarteschlange untersucht.
Verstehen Sie hauptsächlich das folgende Wissen:
1. Was ist eine Warteschlange und was kann sie tun?
2. Welche Einsatzszenarien gibt es für die Ausrichtung?
3. Wie nutzt man Warteschlangen zum Entkoppeln von Diensten?
4. Wie verwende ich die Redis-Warteschlange, um hohen Druck zu beseitigen?
5. Wie verwende ich das professionelle Ausrichtungssystem RabbitMQ?
Der Hauptinhalt ist wie folgt zusammengefasst
@Konzepte, Prinzipien und Szenarien der Nachrichtenwarteschlange
@Entkopplungsfall: Warteschlangenverarbeitungsauftragssystem und Verteilungssystem
@Traffic Peak Shaving Case: Redis List Type implementiert Flash Sale
@RabbitMQ: Eine professionellere Nachrichtensystem-Implementierungslösung
1 Verständnis der Nachrichtenwarteschlange
1.1 Nachrichtenwarteschlangenkonzept
Im Wesentlichen ist die Nachrichtenwarteschlange eine Middleware mit einer Warteschlangenstruktur, was bedeutet, dass die Nachricht direkt nach dem Einfügen in diese Middleware zurückgegeben werden kann Das System muss sie nicht sofort verarbeiten, aber ein anderes Programm liest die Daten und verarbeitet sie der Reihe nach.
Das heißt, wenn Sie auf eine Situation stoßen, in der die Parallelität besonders groß ist und lange dauert und Sie die Verarbeitungsergebnisse nicht sofort zurückgeben müssen, kann die Verwendung von Nachrichtenwarteschlangen solche Probleme lösen.
1.2 Kernstruktur
Stellen Sie die Warteschlange eines Geschäftssystems in die Warteschlange, fügen Sie die Nachrichten einzeln in die Nachrichtenwarteschlange ein und geben Sie anschließend direkt das erfolgreiche Ergebnis zurück Das Einfügen ist erfolgreich. In Zukunft wird es ein Nachrichtenverarbeitungssystem geben, das die Datensätze im Nachrichtensystem einzeln herausnimmt und verarbeitet und so einen Entnahmevorgang abschließt.
1.3 Anwendungsszenarien
Datenredundanz: Beispielsweise erfordert das Bestellsystem in Zukunft eine strikte Datenkonvertierung und -aufzeichnung. Die Nachrichtenwarteschlange kann diese Daten dauerhaft in der Warteschlange speichern, und dann gibt es sie Bestellungen, das nachfolgende Verarbeitungsprogramm erhält es, und nach Abschluss der nachfolgenden Verarbeitung wird dieser Datensatz gelöscht, um sicherzustellen, dass jeder Datensatz verarbeitet werden kann.
Systementkopplung: Nach der Verwendung des Nachrichtensystems werden das Enqueue-System und das Dequeue-System getrennt, was bedeutet, dass der normale Betrieb des anderen Systems nicht beeinträchtigt wird, solange es eines Tages abstürzt.
Reduzierung von Traffic-Spitzen: Beispielsweise können wir bei Flash-Sales und Rush-Sales Nachrichtenwarteschlangen in Verbindung mit Caching verwenden, die der Menge an sofortigen Besuchen effektiv standhalten und verhindern können, dass der Server überlastet wird und einen Absturz verursacht.
Asynchrone Kommunikation: Die Nachricht selbst kann direkt nach der Warteschlange zurückgegeben werden.
Skalierbarkeit: Beispielsweise kann die Bestellwarteschlange nicht nur Bestellungen verarbeiten, sondern auch von anderen Unternehmen genutzt werden.
Sequenzierungsgarantie: Einige Szenarien müssen in der Reihenfolge der Produkte verarbeitet werden, z. B. Single-In und Single-Out, um sicherzustellen, dass Daten in einer bestimmten Reihenfolge verarbeitet werden. Es ist möglich, Nachrichtenwarteschlangen zu verwenden.
Die oben genannten sind gängige Verwendungsszenarien der Nachrichtenwarteschlange. Natürlich ist die Nachrichtenwarteschlange nur eine Middleware und kann in Verbindung mit anderen Produkten verwendet werden.
1.4 Allgemeine Vor- und Nachteile der Warteschlangenimplementierung
Warteschlangenmedien
1. Datenbank wie MySQL (hohe Zuverlässigkeit, einfach zu implementieren, langsam)
2, Cache wie Redis (schnell, geringe Effizienz, wenn ein einzelnes Nachrichtenpaket zu groß ist)
3. Messaging-System wie RabbitMq (hochprofessionell, zuverlässig, hohe Lernkosten)
Auslösemechanismus für die Nachrichtenverarbeitung
1. Endloses Schleifenlesen: einfach zu implementieren, im Fehlerfall nicht rechtzeitig wiederherstellbar (besser geeignet für Flash-Sale, zentralisierter, zentralisierter Betrieb und Wartung)
2. Geplante Aufgaben: Der Druck ist gleichmäßig verteilt, mit einer Verarbeitungsobergrenze, einem derzeit beliebten Verarbeitungsauslösemechanismus. (Der einzige Nachteil besteht darin, dass Sie auf das Intervall und die Daten achten müssen. Warten Sie nicht, bis die vorherige Aufgabe nicht abgeschlossen ist und die nächste Aufgabe erneut beginnt.)
3. Daemon-Prozess: ähnlich wie PHP- fpm und php-cg, erfordert Shell-Grundlagen
2. Entkopplungsfall: Warteschlangenverarbeitung „Bestellsystem“ und „Verteilungssystem“
Für den Bestellvorgang können wir zwei Systeme entwerfen, eines ist das „Bestellsystem“ und das andere ist das „Liefersystem“. Nachdem ich eine Bestellung aufgegeben habe, hätten wir es alle sehen sollen Im Hintergrund ist zu sehen, dass meine Ware in der Mitte geliefert wird. Zu diesem Zeitpunkt muss ein „Liefersystem“ einbezogen werden.
Wenn wir bei der Architektur das „Bestellsystem“ und das „Liefersystem“ gemeinsam entwerfen, wird es einige Probleme geben. Erstens wird der Druck auf das System relativ hoch sein. Aber „Das Vertriebssystem“ muss nicht unbedingt sofort auf diesen Druck reagieren.
Zweitens möchten wir nicht, dass der Ausfall des Bestellsystems zu einem Ausfall des Liefersystems führt, was den normalen Betrieb beider Systeme gleichzeitig beeinträchtigt. Wir hoffen also, diese beiden Systeme zu entkoppeln. Nachdem die beiden Systeme getrennt wurden, können wir über eine zwischengeschaltete „Warteschlangentabelle“ zwischen den beiden Systemen kommunizieren.
2.1 Architekturdesign
1. Zuerst nimmt das Bestellsystem die Bestellung des Benutzers entgegen und verarbeitet die Bestellung.
2. Diese Bestellinformationen werden dann in die Warteschlangentabelle geschrieben. Diese Warteschlangentabelle ist der Schlüssel für die Kommunikation zwischen den beiden Systemen.
3. Ein Programm, das regelmäßig vom Verteilungssystem ausgeführt wird, um die Warteschlangentabelle zur Verarbeitung zu lesen.
4. Nach der Verarbeitung durch das Vertriebssystem werden die verarbeiteten Datensätze markiert.
2.2 Programmablauf
3. Traffic Peak Shaving Case: Der Listentyp von Redis implementiert Flash-Sales
Aufgrund der Speichergeschwindigkeit ist Redis eine sehr gute Ergänzung zur Datenbank. Redis schreibt regelmäßig Daten auf die Festplatte und muss sich daher keine Sorgen über Stromausfälle machen , es hat mehr Vorteile als ein anderer Cache-Memcache. Darüber hinaus bietet Redis fünf Datentypen (String, doppelt verknüpfte Liste, Hash, Set, geordneter Set)
Im Allgemeinen ist es ein Flash-Sale. Redis ist gut Wahl für Fälle, in denen Fälle, Eilkäufe und Fälle, die eine Warteschlange erfordern, sofort höher sind als Ihre.
3.1 Der Listentyp im Redis-Datentyp
Die Liste in Redis ist eine doppelt verknüpfte Liste, und Daten können am Kopf oder Ende angehängt werden.
* LPUSH/LPUSHX: Fügen Sie den Wert in den Kopf der (/vorhandenen) Liste ein
* RPUSH/RPUSHX: Fügen Sie den Wert in das Ende der (/vorhandenen) Liste ein
* LPOP: Entfernen und das erste Element der Liste abrufen
* RPOP: Entfernen und das letzte Element der Liste abrufen
* LTRIM: Elemente im angegebenen Bereich behalten
* LLEN: Ermitteln Sie die Länge der Liste
* LSET: Legen Sie den Wert des Listenelements anhand des Index fest
* LINDEX: Ermitteln Sie das Element in der Liste anhand des Index
* LRANGE: Holen Sie sich die Elemente innerhalb des angegebenen Bereichs der Liste
3.2 Architekturdesign
Ein Flash-Kill-Programmdesign mit einfacher Struktur.
Erfassen Sie zunächst, welcher Benutzer am Flash-Sale teilgenommen hat, und notieren Sie seine Zeit.
2. Speichern Sie die Benutzer-ID in der Redis-Liste und lassen Sie sie in die Warteschlange stellen. Wenn festgelegt ist, dass nur die ersten 10 Benutzer erfolgreich teilnehmen können und die Anzahl in der Liste ausreicht, dürfen keine weiteren Daten hinzugefügt werden. Auf diese Weise beträgt die Länge der Redis-Liste nur 10
3. Schreiben Sie schließlich die Daten in Redis langsam in die Datenbank, um den Druck auf die Daten zu verringern
3.3 Codeebene Design
1. Wenn der Benutzer den Flash-Sale startet, schreiben Sie die Anfrage des Flash-Sale-Programms in Redis (uid, time_stamp).
2. Wenn festgelegt ist, dass nur 10 Personen am Flash-Sale teilnehmen können, überprüfen Sie die Länge der in Redis gespeicherten Daten und verwerfen Sie sie direkt vollendet.
3. Schließlich werden die 10 in Redis gespeicherten Daten in einer Endlosschleife verarbeitet und dann werden die Daten langsam abgerufen und in der MySQL-Datenbank gespeichert.
Der Flash-Verkaufsbereich übt großen Druck auf die Datenbank aus. Wenn wir nicht über ein solches Design verfügen, führt dies zu einem Schreibengpass in MySQL. Wir verwenden eine Warteschlangenliste in Redis und stellen dann die Flash-Sale-Anfrage langsam über das Warehousing-Programm in die Datenbank. Auf diese Weise kann der Datenverkehr ausgeglichen werden und es gibt keine Auswirkungen auf MySQL . Zu viel Druck.
4. RabbitMQ
Hier erklären wir einige Verwendungsmöglichkeiten von RabbitMQ. Als wir zuvor über den Flash-Sale-Fall gesprochen haben, haben wir den Sperrmechanismus zur Verhinderung erwähnt Wenn unsere Systemarchitektur sehr komplex ist, lesen mehrere Programme eine Warteschlange in Echtzeit oder ich habe mehrere Sendeprogramme, die eine oder mehrere Warteschlangen gleichzeitig bedienen, und ich möchte diese Programme sogar Um sie auf verschiedene Maschinen zu verteilen, ist die Verwendung der Redis-Warteschlange etwas unzureichend. Was ist zu diesem Zeitpunkt zu tun? Wir müssen einige professionellere Nachrichtenwarteschlangensysteme einführen, die das Problem besser lösen können.
4.1 Architektur und Prinzipien von RabbitMQ
Features: Vollständige Implementierung von AMQP, Cluster-Vereinfachung, Persistenz, plattformübergreifend
RabbitMQS Verwendung
1. RabbitMQ-Installation (rabbitmq-server, php-amqplib)
2. Produzent sendet Nachricht an Nachrichtenkanal
3. Verbraucher verarbeitet Nachricht
Arbeitswarteschlange
Idee: Der Produzent sendet sie an das Nachrichtensystem, und das Nachrichtensystem kapselt die Aufgabe in eine Nachrichtenwarteschlange und verwendet dann dieselbe Warteschlange für mehrere Verbraucher
Dies löst nicht nur die Entkopplung zwischen Produzenten und Konsumenten, sondern ermöglicht auch die gemeinsame Nutzung von Konsumenten und Aufgaben, wodurch der Druck auf den Server verringert wird.
5. Zusammenfassung
Das Obige konzentriert sich hauptsächlich auf das Erlernen der Konzepte, Prinzipien und Szenarien von Nachrichtenwarteschlangen. Fälle entkoppeln und die einfache Verwendung von RabbitMQ verstehen.
6. Frage
Was ist der größte Unterschied zwischen Redis und der Auswahl des Nachrichtenservers?
Mein Verständnis ist, dass Redis eine einzelne Thread-Implementierung ist. Einer ist synchron und der andere ist asynchron, während Redis synchrone Blockierung verwendet Nachrichtenserver Verwenden Sie asynchrone, nicht blockierende Funktionen.
Weitere Informationen zu Redis finden Sie in der Spalte Tutorial zur Redis-Nutzung!
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Konzepte, Prinzipien und Nutzungsszenarien von Nachrichtenwarteschlangen (mit Fällen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!