Heim  >  Artikel  >  Java  >  Einführung in das Java-Architekturdesign mit hoher Parallelität (Bilder und Text)

Einführung in das Java-Architekturdesign mit hoher Parallelität (Bilder und Text)

不言
不言nach vorne
2018-10-20 17:29:005715Durchsuche

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:

Einführung in das Java-Architekturdesign mit hoher Parallelität (Bilder und Text)

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:

Einführung in das Java-Architekturdesign mit hoher Parallelität (Bilder und Text)

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 Cache

Der 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:

Einführung in das Java-Architekturdesign mit hoher Parallelität (Bilder und Text)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 Daten

Wenn 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.

Einführung in das Java-Architekturdesign mit hoher Parallelität (Bilder und Text)

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen