Der Inhalt dieses Artikels ist eine Einführung (Bilder und Texte) zum Design der Java-Architektur mit hoher Parallelität. Ich hoffe, dass er für Sie hilfreich ist.
Vorwort
Eine hohe Parallelität tritt häufig in Geschäftsszenarien mit einer großen Anzahl aktiver Benutzer und einer hohen Benutzerkonzentration auf, z. B. bei Flash-Sale-Aktivitäten und beim Empfang roter Umschläge in regelmäßigen Abständen usw.
Um einen reibungslosen Geschäftsablauf zu ermöglichen und den Benutzern ein gutes interaktives Erlebnis zu bieten, müssen wir eine für unser Geschäftsszenario geeignete Verarbeitungslösung mit hoher Parallelität entwerfen, die auf Faktoren wie der geschätzten Parallelität des Geschäftsszenarios basiert .
Videokursempfehlung →: "Ten-Million-Level-Data-Concurrency-Lösung (Theorie + praktischer Kampf)"
In Im Laufe der Jahre der E-Commerce-bezogenen Produktentwicklung bin ich auf verschiedene Fallstricke gestoßen. Die Zusammenfassung hier dient als meine eigene Archivaufzeichnung und ich werde sie mit Ihnen teilen alle. .
1. Serverarchitektur
Das Unternehmen ist von den frühen Entwicklungsstadien an allmählich gereift, und auch die Serverarchitektur hat sich von einer relativ einzelnen zu einer Cluster- und dann zu einer verteilten Serverarchitektur entwickelt Dienstleistungen.
Eine gute Serverarchitektur, die eine hohe Parallelität unterstützen kann, ist unverzichtbar. Sie benötigt eine ausgeglichene Last, die Datenbank benötigt einen Master-Slave-Cluster, der NoSQL-Cache benötigt einen Master-Slave-Cluster und statische Dateien müssen dorthin hochgeladen werden cdn. Dies sind alles Dinge, die Geschäftsprogrammen eine leistungsstarke Unterstützung für einen reibungslosen Betrieb ermöglichen können.
Der Serverteil erfordert hauptsächlich die Mitarbeit von Betriebs- und Wartungspersonal beim Bau. Ich werde nicht näher darauf eingehen und hier aufhören.
Die ungefähr erforderliche Serverarchitektur ist wie folgt:
Server
Balancierlast (z. B. Nginx, Alibaba Cloud SLB)
Ressourcenüberwachung
Verteilt
Datenbank
Master-Slave-Trennung, Cluster
DBA-Tabellenoptimierung, Indexoptimierung usw.
Verteilungsformel
nosql
Master-Slave-Trennung, Cluster
Master-Slave-Trennung, Cluster
Master-Slave-Trennung, Cluster
redis
mongodb
memcache
cdn
html
css
js
image
Parallelitätstests
Unternehmen mit hohem Parallelitätsbezug erfordern Parallelitätstests, und eine große Menge an Datenanalysen wird verwendet, um den Grad der Parallelität der gesamten Architektur zu bewerten unterstützen kann.
Um eine hohe Parallelität zu testen, können Sie einen Server eines Drittanbieters oder Ihren eigenen Testserver verwenden, Testtools zum Testen gleichzeitiger Anforderungen verwenden und die Testdaten analysieren, um eine Schätzung der Anzahl möglicher Parallelitäten zu erhalten Dies kann als Frühwarnhinweis dienen. Wie das Sprichwort sagt: Kämpfen Sie hundert Mal ohne Gefahr.
Drittanbieterdienste:
Alibaba Cloud Performance Test
Parallelitätstesttool:
Apache JMeter
Visual Studio Performance Load Test
Microsoft Web Application Stress Tool
Praktische Lösung
Allgemeine Lösung
Der tägliche Benutzerverkehr ist groß, aber relativ verstreut und gelegentlich auch große Ansammlungen von Benutzern sein;
Szenarien: Benutzer-Check-in, Benutzercenter, Benutzerbestellung usw.
Serverarchitekturdiagramm:
Hinweis:
Diese Unternehmen im Szenario sind grundsätzlich die, die Benutzer nach dem Betreten der APP betreiben werden, mit Ausnahme von Veranstaltungstagen (618). , Double 11 usw.), die Anzahl der Benutzer dieser Unternehmen wird nicht hoch sein. Gleichzeitig handelt es sich bei diesen geschäftsbezogenen Tabellen alle um Big-Data-Tabellen, und das Geschäft besteht hauptsächlich aus Abfragevorgängen, sodass wir die Abfragen reduzieren müssen dass Benutzer direkt auf die Datenbank zugreifen, den Cache abfragen und dann die Abfrageergebnisse zwischenspeichern, wenn der Cache nicht vorhanden ist.
Das Aktualisieren benutzerbezogener Caches erfordert verteilten Speicher, z. B. die Verwendung von Benutzer-IDs für die Hash-Gruppierung und die Verteilung von Benutzern auf verschiedene Caches. Auf diese Weise wird die Gesamtmenge eines Cache-Sets nicht groß und hat keinen Einfluss auf die Abfrage Effizienz.
Programme wie:
Benutzer melden sich an, um Punkte zu erhalten
Berechnen Sie den Benutzerverteilungsschlüssel und finden Sie die heutigen Anmeldeinformationen des Benutzers Redis-Hash
Wenn die Check-in-Informationen abgefragt werden, werden die Check-in-Informationen zurückgegeben
Wenn sie nicht abgefragt werden, fragt die DB ab, ob der Check-in heute durchgeführt wurde In diesem Fall werden die Check-in-Informationen mit dem Redis-Cache synchronisiert.
Wenn der heutige Check-in-Datensatz nicht in der DB abgefragt wird, wird die Check-in-Logik ausgeführt und die DB wird betrieben, um den heutigen Check-in-Datensatz und die Check-in-Punkte hinzuzufügen (dieser gesamte DB-Vorgang ist). eine Transaktion)
Cache-Check-in Senden Sie die Informationen an redis und geben Sie die Check-in-Informationen zurück
Hinweis
In Parallelitätssituationen treten logische Probleme auf, wie zum Beispiel: Mehrmals am Tag einchecken und mehrere Punkte an Benutzer vergeben.
Mein Blogbeitrag [Hohe Parallelität in den Augen von Programmierern] enthält relevante Lösungen.
Benutzerbestellungen
Hier speichern wir nur die Bestellinformationen auf der ersten Seite des Benutzers, bei 40 Daten auf einer Seite sehen Benutzer im Allgemeinen nur die Bestellung Daten auf der ersten Seite.
Wenn der Benutzer auf die Bestellliste zugreift, wenn es sich um die erste Seite handelt, die den Cache liest, wenn er nicht die Datenbank liest
Berechnen Sie den von der verteilten Schlüssel Benutzer und durchsuchen Sie die Bestellinformationen des Benutzers im Redis-Hash
Wenn Sie die Bestellinformationen des Benutzers abfragen und die Bestellinformationen zurücksenden
Wenn es nicht vorhanden ist, führen Sie eine DB-Abfrage für die Bestelldaten auf der ersten Seite durch, speichern Sie dann Redis zwischen und geben Sie die Bestellinformationen zurück
Benutzercenter
Berechnen Sie den Benutzerverteilungsschlüssel, suchen Sie nach Benutzerauftragsinformationen im Redis-Hash
Wenn Benutzerinformationen abgefragt werden, geben Sie Benutzerinformationen zurück
Wenn sie nicht vorhanden sind, fragen Sie die Benutzerdatenbank ab, speichern Sie dann Redis zwischen und geben Sie den Benutzer zurück Informationen
Andere Unternehmen
Das obige Beispiel ist eine relativ einfache Architektur mit hoher Parallelität, die gut unterstützt werden kann, wenn die Parallelität nicht sehr hoch ist. Wenn das Unternehmen wächst, wird auch die Anzahl der Benutzer gleichzeitig optimiert und weiterentwickelt. Jeder Dienst verfügt über eine eigene parallele Architektur, einen eigenen ausgewogenen Server, eine verteilte Datenbank und einen NoSQL-Master-Slave Cluster, wie Benutzerdienste und Bestelldienste;
Nachrichtenwarteschlange
Aktivitäten wie Flash-Sales und Flash-Grabs führen dazu, dass Benutzer sofort strömen und viele gleichzeitige Anfragen generieren
Szenario: Regelmäßiger Erhalt roter Umschläge usw.
Serverarchitekturdiagramm:
Beschreibung:
Geplante Sammlung in der Szene Es handelt sich um ein sehr gleichzeitiges Geschäft. Wenn dies der Fall ist, werden Benutzer von Flash-Sale-Aktivitäten zu einem bestimmten Zeitpunkt strömen Wenn Sie es nicht halten können, wird es ausfallen, was sich auf das gesamte Unternehmen auswirkt.
Diese Art von Geschäft ist nicht nur ein Abfragevorgang, sondern erfordert auch eine stark gleichzeitige Dateneinfügung oder -aktualisierung. Die oben erwähnte allgemeine Lösung kann nicht unterstützt werden Während der Parallelität wird die Nachrichtenwarteschlange direkt in die Datenbank geschrieben -Thread-Programm, um die Warteschlange zu nutzen und den Benutzern in der Warteschlange rote Umschläge auszugeben.
Die Lösung lautet wie folgt:Erhalten Sie regelmäßig rote Umschläge
Im Allgemeinen wird die Redis-Liste verwendet.
Wenn der Benutzer an der Aktivität teilnimmt, werden die Informationen zur Benutzerbeteiligung in die Warteschlange verschoben.
Schreiben Sie dann ein Multithread-Programm, um die Daten anzuzeigen und die Aufgabe der Ausgabe roter Umschläge erledigen
Dies kann Benutzern mit hoher Parallelität dabei helfen, normal an Aktivitäten teilzunehmen und die Gefahr von Ausfallzeiten des Datenbankservers zu vermeiden
Level 1 CacheDer Cache-Server für Verbindungen mit hohen gleichzeitigen Anforderungen übersteigt die Anzahl der Anforderungsverbindungen, die der Server empfangen kann, und einige Benutzer haben das Problem, dass beim Herstellen einer Verbindung eine Zeitüberschreitung auftritt und die Daten nicht gelesen werden können;
Daher muss eine Lösung vorhanden sein, die die Anzahl der Zugriffe auf den Cache-Server reduzieren kann, wenn die Parallelität hoch ist.
Zu diesem Zeitpunkt wird die Cache-Lösung der ersten Ebene angezeigt Beachten Sie, dass nur ein Teil des Anforderungsvolumens gespeichert wird und die Menge der zwischengespeicherten Daten nicht übermäßig genutzt werden darf, um den normalen Betrieb der Site-Anwendung zu beeinträchtigen Der Cache der ersten Ebene muss eine Ablaufzeit in Sekunden festlegen. Die spezifische Zeit wird entsprechend dem Geschäftsszenario festgelegt. Der Zweck besteht darin, die Datenerfassung auf den Cache der ersten Ebene zu übertragen, ohne eine Verbindung zum Cache herzustellen NOSQL-Datenserver, wodurch der Druck auf den NOSQL-Datenserver verringert wird
Zum Beispiel sind diese Daten auf dem ersten Bildschirm der Produktdatenschnittstelle der APP Die öffentlichen Daten werden nicht für Benutzer angepasst, und diese Daten werden nicht angepasst Wird häufig aktualisiert. Wenn das Anforderungsvolumen dieser Schnittstelle relativ groß ist, kann sie dem Cache der ersten Ebene hinzugefügt werden.
Serverarchitekturdiagramm:
Standardisieren und verwenden Sie die NoSQL-Cache-Datenbank angemessen und teilen Sie den Cache-Datenbank-Cluster entsprechend dem Geschäft auf. Dies kann das Geschäft grundsätzlich gut unterstützen, und der Cache der ersten Ebene ist schließlich für Sie verwenden den Site-Server-Cache, sodass Sie ihn trotzdem sinnvoll nutzen müssen.
Statische DatenWenn sich die Daten bei hohen gleichzeitigen Anforderungen nicht ändern und Sie nicht Ihren eigenen Server anfordern müssen, um Daten abzurufen, können Sie den Ressourcendruck reduzieren Der Server.
Wenn die Aktualisierungshäufigkeit nicht hoch ist und die Daten eine kurze Verzögerung zulassen, können Sie die Daten statisch in JSON-, XML-, HTML- und andere Datendateien konvertieren und sie beim Abrufen von Daten in CDN hochladen Wenn die Daten nicht abgerufen werden, rufen Sie sie aus dem Cache oder der Datenbank ab. Bearbeiten Sie die Daten, generieren Sie die statische Datei neu und laden Sie sie in das CDN hoch, damit die Daten abgerufen werden können CDN-Server in Zeiten hoher Parallelität. Da es bei der CDN-Knotensynchronisierung zu einer gewissen Verzögerung kommt, ist es auch wichtig, einen zuverlässigen CDN-Serveranbieter zu finden.
Das obige ist der detaillierte Inhalt vonEinführung in das Java-Architekturdesign mit hoher Parallelität (Bilder und Text). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!