Wenn Golang auf eine hohe Parallelität stößt, wird sofort getötet~
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!
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. 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. 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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Das sichere Lesen und Schreiben von Dateien in Go ist von entscheidender Bedeutung. Zu den Richtlinien gehören: Überprüfen von Dateiberechtigungen, Schließen von Dateien mithilfe von Verzögerungen, Validieren von Dateipfaden, Verwenden von Kontext-Timeouts. Das Befolgen dieser Richtlinien gewährleistet die Sicherheit Ihrer Daten und die Robustheit Ihrer Anwendungen.

Wie konfiguriere ich Verbindungspooling für Go-Datenbankverbindungen? Verwenden Sie den DB-Typ im Datenbank-/SQL-Paket, um eine Datenbankverbindung zu erstellen. Legen Sie MaxOpenConns fest, um die maximale Anzahl gleichzeitiger Verbindungen festzulegen. Legen Sie ConnMaxLifetime fest, um den maximalen Lebenszyklus der Verbindung festzulegen.

Das Go-Framework zeichnet sich durch seine hohen Leistungs- und Parallelitätsvorteile aus, weist jedoch auch einige Nachteile auf, z. B. dass es relativ neu ist, über ein kleines Entwickler-Ökosystem verfügt und einige Funktionen fehlen. Darüber hinaus können schnelle Änderungen und Lernkurven von Framework zu Framework unterschiedlich sein. Das Gin-Framework ist aufgrund seines effizienten Routings, der integrierten JSON-Unterstützung und der leistungsstarken Fehlerbehandlung eine beliebte Wahl für die Erstellung von RESTful-APIs.

Der Unterschied zwischen dem GoLang-Framework und dem Go-Framework spiegelt sich in der internen Architektur und den externen Funktionen wider. Das GoLang-Framework basiert auf der Go-Standardbibliothek und erweitert deren Funktionalität, während das Go-Framework aus unabhängigen Bibliotheken besteht, um bestimmte Zwecke zu erreichen. Das GoLang-Framework ist flexibler und das Go-Framework ist einfacher zu verwenden. Das GoLang-Framework hat einen leichten Leistungsvorteil und das Go-Framework ist skalierbarer. Fall: Gin-Gonic (Go-Framework) wird zum Erstellen der REST-API verwendet, während Echo (GoLang-Framework) zum Erstellen von Webanwendungen verwendet wird.

JSON-Daten können mithilfe der gjson-Bibliothek oder der json.Unmarshal-Funktion in einer MySQL-Datenbank gespeichert werden. Die gjson-Bibliothek bietet praktische Methoden zum Parsen von JSON-Feldern, und die Funktion json.Unmarshal erfordert einen Zieltypzeiger zum Unmarshalieren von JSON-Daten. Bei beiden Methoden müssen SQL-Anweisungen vorbereitet und Einfügevorgänge ausgeführt werden, um die Daten in der Datenbank beizubehalten.

Best Practices: Erstellen Sie benutzerdefinierte Fehler mit klar definierten Fehlertypen (Fehlerpaket). Stellen Sie weitere Details bereit. Protokollieren Sie Fehler ordnungsgemäß. Geben Sie Fehler korrekt weiter und vermeiden Sie das Ausblenden oder Unterdrücken. Wrappen Sie Fehler nach Bedarf, um Kontext hinzuzufügen

Die FindStringSubmatch-Funktion findet die erste Teilzeichenfolge, die mit einem regulären Ausdruck übereinstimmt: Die Funktion gibt ein Segment zurück, das die passende Teilzeichenfolge enthält, wobei das erste Element die gesamte übereinstimmende Zeichenfolge und die nachfolgenden Elemente einzelne Teilzeichenfolgen sind. Codebeispiel: regexp.FindStringSubmatch(text,pattern) gibt einen Ausschnitt übereinstimmender Teilzeichenfolgen zurück. Praktischer Fall: Es kann verwendet werden, um den Domänennamen in der E-Mail-Adresse abzugleichen, zum Beispiel: email:="user@example.com", pattern:=@([^\s]+)$, um die Übereinstimmung des Domänennamens zu erhalten [1].

Backend Learning Path: Die Erkundungsreise von Front-End zu Back-End als Back-End-Anfänger, der sich von der Front-End-Entwicklung verwandelt, Sie haben bereits die Grundlage von Nodejs, ...
