Heim  >  Artikel  >  Backend-Entwicklung  >  Wenn Golang auf eine hohe Parallelität stößt, wird sofort getötet~

Wenn Golang auf eine hohe Parallelität stößt, wird sofort getötet~

藏色散人
藏色散人nach vorne
2020-10-29 15:10:482219Durchsuche

Die folgende Kolumne stellt Ihnen die Kolumne Golang-Tutorial vor, wenn Golang auf hohe Parallelitätsspitzen stößt. Ich hoffe, dass sie Freunden in Not hilfreich sein wird!

Wenn Golang auf eine hohe Parallelität stößt, wird sofort getötet~

Es ist auch eine gelegentliche Gelegenheit, auf die GO-Sprache zu stoßen. Ich mache architekturbezogene Dinge bei der Arbeit, daher muss ich auf die neuen und beliebten Sprachen achten. Auf diese Weise betrat ich die Welt der GO-Sprache.

Menschen, die eine Sache getan haben, geraten oft in eine Falle. Als ich anfing, die GO-Sprache zu üben, fühlte ich mich überall unbehaglich. , insbesondere die Behandlung von Strukturen als Klassen und die Vererbung von Strukturen. Beim Schreiben begann ich zu viel nachzudenken und es fiel mir wirklich schwer, darüber hinwegzukommen. Aber je mehr ich schreibe, desto mehr gewöhne ich mich daran und es wird sogar für meine Augen immer angenehmer.

Nachdem ich mich eine Weile mit GO vertraut gemacht hatte, hielt ich für eine Weile inne und dachte immer wieder über die Einfachheit von GO nach (der Codestil ist konsistent, er ist prägnant und nicht nachlässig zu verwenden, die Bereitstellung ist extrem einfach und die Kompilierungsgeschwindigkeit). kann als schnell bezeichnet werden). Welche Änderungen werden das Projektsystem und die Architektur mit sich bringen? Aber damals hatte ich wirklich nicht damit gerechnet, wie hilfreich es sein würde. Später begann ich, das System nach und nach mit GO zu implementieren, und stellte langsam fest: „Hey ~, du musst keins mehr bauen.“ abhängige Umgebung für die Bereitstellung (veröffentlichen, ohne die Umgebung bereitzustellen, ich war anfangs wirklich nicht daran gewöhnt und hatte immer das Gefühl, dass etwas fehlte;

Ich habe keinen Widerstand gespürt, als ich mir den von anderen geschriebenen Code angesehen habe. Obwohl einige Codes wurden nicht von mir selbst geschrieben, als ich sie sorgfältig las, hatte ich das Gefühl, dass ich sie selbst geschrieben hatte. Beim Schreiben von JAVA und PHP weigere ich mich aus tiefstem Herzen, einen zu entwickeln Bestimmte Microservice-Schnittstelle. Schreiben Sie eine Hauptschnittstelle, schreiben Sie eine Schnittstelle, senden Sie sie ab und sie ist in Sekundenschnelle online ~;

Das Obige bezog sich hauptsächlich auf meine Begegnung mit GO und die ersten Auswirkungen, die GO auf mich hatte. Eines Nachts kam mir plötzlich eine Idee in den Sinn: Die Einfachheit der GO-Sprache hat zu vielen Verbesserungen geführt und ob das Architektursystem, an dem ich arbeite Kann GO auch zur Vereinfachung und Reduzierung der Systemkomplexität eingesetzt werden? Wenn ich an die Zeit zurückdenke, als ich anfing, mich mit Architektur zu beschäftigen, war ich sehr aufgeregt, als ich sah, über welche Prinzipien Middleware spricht und welche Optimierungen die Leistung verbessern können, bis ich das Gefühl hatte, dass ich es beherrschte (natürlich möchte ich es immer noch). Und dann habe ich geschworen, es im System zu verwenden. Je mehr Middleware-Komponenten in der Systemarchitektur verwendet werden, desto leistungsfähiger wird es. Wenn Sie dies jedoch über einen längeren Zeitraum tun, werden Sie feststellen, dass das System nur nutzbar sein muss und Sie es nicht aus Gründen der Architektur erstellen können. Auch das Abweichen vom traditionellen Technologie-Stack erfordert tiefes Wissen, denn nur wenn wir die technischen Prinzipien vollständig verstehen, können wir ihn ersetzen und nur dann können wir es wagen, zu denken und es zu tun, ohne Probleme zu verursachen. Wie das Sprichwort sagt: „Alle Kontinente führen nach Rom.“ Aus persönlicher Sicht muss die Architektur zum jeweiligen Unternehmen passen. Das Ziel des architektonischen Designs ist es, so viel wie möglich mit den geringsten Kosten zu erreichen Es verbraucht die gleichen Serverressourcen und kann in einigen Fällen mehrere oder sogar Dutzende von Anfragen unterstützen. Wenn das gleiche Anfragevolumen erreicht ist, sind die Implementierung und Bereitstellung sehr einfach. GOs Gedanken haben mich in dieser Zeit auf subtile Weise beeinflusst.

Bis sich unser Unternehmen für Microservices entschieden hat, haben wir zu Beginn Java für Microservices verwendet. Später habe ich darüber nachgedacht, ob auch andere Sprachen Microservices ausführen können, und natürlich habe ich an GO gedacht. Nach einigem Hin und Her hatte ich das Gefühl, dass es in Ordnung ist, also begann ich, einige Microservices mit GO zu schreiben. Ich habe festgestellt, dass sich Golang recht gut zum Schreiben von Microservices eignet und dass es nicht erforderlich ist, Tomcat zu kapseln (es fühlt sich sehr unangemessen an, dieses Ding in ein JAR-Paket zu packen, das in Docker ohne Systemabhängigkeiten ausgeführt werden kann). (Probieren Sie es aus, wenn Sie mir nicht glauben.) Aus tiefstem Herzen wird es immer besser. Je mehr ich GO mag, desto mehr möchte ich GO verwenden, um nachfolgende Systeme zu rekonstruieren. und wenn ich auf eine solche Bequemlichkeit stoße, habe ich das Gefühl, dass der Frühling GO die Sicht auf die Systemarchitektur tiefgreifend beeinflusst hat.

 Aber was genau ist Architektur und wie wird ein Architekt gemacht? Hier sind acht Härtestufen auf dem Weg zum Architekten:

 Der erste Absatz: Das Verschieben von Ziegeln wird in diejenigen unterteilt, die gut mit Ziegeln umgehen können, und diejenigen, die nur wissen, wie es geht Steine ​​bewegen (Es gibt eine Gruppe von Leuten, die in der Ziegelei bleiben, und der Rest entwickelt sich weiter);

 Zweiter Absatz: Diejenigen, die Steine ​​bewegen können, können in diejenigen unterteilt werden, die die Prinzipien verstehen müssen, und diejenigen, die programmieren um Steine ​​zu bewegen;

 Dritter Absatz: diejenigen, die die Prinzipien verstehen Sie werden weiter unterteilt in diejenigen, die ständig forschen und diejenigen, die nur wenig Wissen haben

 Der vierte Absatz: Kontinuierliche Forschung kann auch in zwei Arten unterteilt werden: diejenigen deren Forschung tiefgründig, aber breit gefächert ist, und diejenigen, die nur an der Oberfläche kratzen, aber nicht breit angelegt sind; Der sechste Absatz: Der Geschäftstyp erfordert eine gute Kommunikation und eine gewisse Designkontrollfähigkeit für das System und die Anforderungen

Der siebte Absatz: Es ist einfach, Heap-Middleware allein zum Aufbau dieser Ebene zu verwenden (Junior Architect), der an „Architektur“ arbeitet; Systeme;

Der achte Absatz: Dies ist ein sehr wichtiger Punkt, der das Problem sorgfältig und umfassend betrachtet und gut in der Kommunikation ist. Führen Sie die zugrunde liegende Implementierung durch, verstehen Sie die zugrunde liegenden Prinzipien und beginnen Sie aus mehreren Perspektiven von Geschäft, Forschung und Entwicklung, Tests, Bereitstellung, Wartung und Upgrades. Die entsprechend den lokalen Bedingungen erstellte „Architektur“ dient der Entwicklungseffizienz, der Betriebseffizienz, der Entwicklungsqualität und der Geschäftsflexibilität Aus Gründen der Wartungsfreundlichkeit können solche Personen als Architekten bezeichnet werden (wenn Sie Erfahrung in diesem Bereich haben, denken Sie darüber nach, wie viele Architekturen oberflächlich betrachtet schön aussehen, aber tatsächlich unbequem zu verwenden sind).

Beim Aufbau eines Flash-Sale-Systems fällt mir am Anfang der traditionelle Technologie-Stack ein, den ich mir am einfachsten vorstellen kann: verteilte Sitzung, Redis-Cluster, verteilter Cache, Nginx-Reverse-Proxy, Nginx-Tiefenoptimierung, Maschinenoptimierung und Nachrichtenwarteschlange . Ja, darüber hat Herr Cap damals auch nachgedacht und war davon überzeugt, dass die Anwendung dieser „ausgereiften“ Technologien in unserem Flash-Sale-System kein Problem darstellen würde Das. Und wir haben eingehende Untersuchungen durchgeführt, wie zum Beispiel:

  1. Verteilte Sitzung Wir haben große Anstrengungen unternommen, um die Sitzung mithilfe des Nginx+web+redis-Clusters zu speichern und den Zweck der Sitzungsüberprüfung zu erreichen -Punkt-Sitzung ist wie folgt:

Auf den ersten Blick gibt es kein Problem. Wenn der Datenverkehr wirklich groß ist, werden Nginx und Webserver hinzugefügt Aber nachdem der Datenverkehr Hunderte von Millionen erreicht hat, werden die Kosten etwas hoch sein, und wir möchten auch die Zeit für die Round-Trip-Netzwerkanforderungssitzung verkürzen (das hatte ich damals immer). etwas stimmte nicht), und Nginx zeigt bei hohem Datenverkehr von Zeit zu Zeit auch 504 an.

Wenn Golang auf eine hohe Parallelität stößt, wird sofort getötet~ 2. Verteilter Cache, diese Sache sieht sehr einfach aus, ist aber in einem System mit großem Datenverkehr und hoher Parallelität eine sehr komplizierte Sache. Die folgenden Probleme können hauptsächlich auftreten:

 1) Cache-Konsistenz (wenn Sie dies verwenden , Wenn nicht gut gehandhabt wird, kommt es zu einem Überverkauf);

 2) Cache-Penetration;

 3) Cache-Lawine;

 4) Cache-Schwarzloch-Problem:

 5) Hundehaufen-Effekt;

 ...Es gibt viele Dinge, auf die man achten muss. Kurz gesagt, verteilter Cache ist sehr vielseitig und wertvoll, aber der Aufbau eines verteilten Cache-Systems, das hoher Parallelität und großem Datenverkehr gerecht wird, erfordert die Unterstützung eines starken technischen Teams. Auch die Implementierung ist sehr kompliziert und ich werde hier nicht auf Details eingehen.

Unsere scheinbar problemlose Lösung weist jedoch große Probleme auf. Sie ist „zu schwierig“ und die Hürde ist sehr hoch. Die Ressourcenkosten sind ebenfalls recht hoch. Der Web-Cache muss auch der horizontalen Erweiterung gerecht werden, einschließlich des Redis-Clusters.

  Geben Sie ein einfaches Beispiel an (abgesehen von anderen Faktoren). Um die Bedeutung der Architektur zu veranschaulichen, gehen wir davon aus, dass wir jetzt über eine einzelne Maschine verfügen, deren Schnittstelle eine Verarbeitungskapazität von 5000 QPS (8 Kerne und 8 G) hat und Hunderte Millionen Datenverkehr für den Flash-Verkauf verarbeiten muss Der Datenverkehr zu Beginn des Flash-Verkaufs wird auf 300 W geschätzt, und die durchschnittliche Wartezeit beträgt 7. Berechnet in Sekunden (die Schnittstelle toleriert 3,5 WQPS). Das Ergebnis ist, dass unser System fast 90 Schnittstellen benötigt. Andere unterstützende Server sind nicht enthalten mit den gleichen Anforderungen. Diese unterstützenden Server werden wie folgt kurz beschrieben: 1. Zunächst muss die Nginx-Ebene über die gleichen Verarbeitungsfunktionen verfügen (ohne Optimierung beträgt jede Einheit etwa 2 WQPS, schätzungsweise etwa 20 Einheiten).

  2. Die Weboberfläche muss ebenfalls auf die entsprechende Ebene erweitert werden (geschätzte 90 Einheiten);

  3. Reids Das Clustering mehrerer Produkte ist in manchen Fällen sinnvoll (bei einzelnen Produkten ist das Clustering nutzlos, wenn es eine große Anzahl gibt). Anzahl der Besuche);

 Die oben genannten sind die Maschinenanforderungen, die verteilte Sitzungen erfüllen müssen, und der verteilte Cache ist wahrscheinlich nicht enthalten. Ich habe wahrscheinlich erkannt, wie schwierig es ist, ein Flash-Sale-System aufzubauen und zu implementieren des Einsatzes wurde nicht berücksichtigt. Die Umsetzung ist wirklich kompliziert und ein oder zwei Leute mit 4-5 Jahren Erfahrung können es wirklich nicht in kurzer Zeit schaffen. Können Sie sich andere Möglichkeiten vorstellen, es zu vereinfachen? Die Antwort lautet: Ja. Erstens müssen wir das Prinzip verstehen und zweitens müssen wir Abzüge von der Architektur vornehmen. Wenn Sie es nicht verwenden, ist keine Optimierung erforderlich.

  Wo sollten wir optimieren?

  1) Sitzung kann in der Flash-Parallelität weggelassen werden, basierend auf dem Prinzip der Berechtigungsüberprüfung;

  2) Wir können keinen verteilten Cache verwenden (nutzen Sie stattdessen die Schnittstelle);

 auch weggelassen (Verringerung der Betriebs- und Wartungsschwierigkeiten); und PHP, aber es kann schwieriger sein, es zu implementieren. Jetzt können wir die GO-Sprachfunktionen kombinieren, um uns neue Ideen zu liefern

  2. Verwenden Sie stattdessen die Cookie-Methode oder die WT-Methode, serverseitige Codeebenenüberprüfung

  3. Oversell verwendet Schnittstellenform anstelle von Redis-Cluster

 );

Nach der Flash-Sale-Optimierung kann die Präsidentenarchitektur wie folgt angezeigt werden: Detaillierte Methoden finden Sie unter „Go High Concurrency Flash Kill Practice“:

Aus den Ergebnissen der Transformation: Wir listen hauptsächlich Folgendes auf:

1. Webanwendungen verwenden alle die Go-Methode zum Bereitstellen von Binärdateien, Centos. Der Server muss keinen Abhängigkeiten folgen (was die Bereitstellung erheblich erleichtert):

 2. Die Verwendung von SLB vermeidet eine kostengünstige und praktische Lösung Der Reverse-Proxy von Nginx und sogar erweiterte Lua-Skripte werden vermieden.

Wenn Golang auf eine hohe Parallelität stößt, wird sofort getötet~ 3. Der Redis-Cluster wird hier ebenfalls vermieden und verwendet Schnittstellen zur Bereitstellung von Diensten.

Der gesamte Technologie-Stack muss nur wissen: GO, RabbitMQ, MySQL Vervollständigen Sie das Flash-Sale-System mit hoher Parallelität. Erstens ist es von der Benutzerfreundlichkeit her sehr attraktiv. Unten können Sie die angepasste Architektur sehen. Basierend auf der obigen Schlussfolgerung (derzeit bietet das eigenständige GO wahrscheinlich eine Webschnittstelle). 2 WQPS ohne Optimierung erreichen):

 1. Die Leistung der eigenständigen GO-Schnittstellenberechtigungsüberprüfung wird um das Vierfache erhöht, und die Bereitstellungskomplexität kann als nahe Null bezeichnet werden (ohne Nginx, kein Redis-Cluster, keine abhängige Umgebung für den Betrieb). ;

  2. Da das Verkehrsaufkommen weiter zunimmt, müssen nur Webserver und Mengenkontrollserver hinzugefügt werden, und es gibt keinen weiteren Service-Overhead (man kann sagen, dass die Skalierbarkeit so weit wie möglich reduziert wird). Kosten, proportional Wachstumsmodell und kein Leistungsengpass);

 3. Im Vergleich zur herkömmlichen Lösung wird die Anzahl der Server um mehr als das Vierfache reduziert (Sie können sie auf der ursprünglichen Basis berechnen);

 Die obige Lösung ist im GO Sprache Es ist einfach zu implementieren und vereinfacht die Implementierung. GO kann Webdienste bereitstellen und externe Abhängigkeiten reduzieren (seine Webdienstleistung ist ebenfalls sehr hoch). Mit den beiden Just-in-Time-Funktionen von GO ist es nicht schwierig, das gesamte Flash-Sale-System durch Subtrahieren der passenden Architektur zu implementieren. Natürlich können sowohl Java als auch PHP die angepasste Flash-Sale-Architektur im Bild oben implementieren. Aber in vielerlei Hinsicht hat der Präsident immer noch einen klaren Vorteil gegenüber GO.

Wenn ich auf den Plan zurückblicke, habe ich das Gefühl, dass Go zu Veränderungen in den Denkmustern geführt hat. Seine Einfachheit hat zu einer einfachen Implementierung geführt, und seine hohe Effizienz und Stabilität haben zu einer Optimierung der Architektur geführt. Eine gute Systemarchitektur sollte einfach, effizient und leicht zu implementieren sein;

Das obige ist der detaillierte Inhalt vonWenn Golang auf eine hohe Parallelität stößt, wird sofort getötet~. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.im. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Was sind CanSet, CanAddr?Nächster Artikel:Was sind CanSet, CanAddr?