In diesem Beitrag werden wir über eine Bibliothek sprechen, die Knoten an sich registriert und Anforderungen von außerhalb an einen bestimmten Knoten umleitet.
Wie sind Sie auf die Idee gekommen, dieses Projekt zu schreiben?
Nachdem es notwendig war, Websites in großen Mengen zu analysieren, versuchte ich, so etwas mithilfe eines Selengitters zu implementieren, und nahm dann Selenoid. Selenoid kam auf, aber es gab eine Menge, die ich nicht brauchte, zum Beispiel Versionen und Browseroptionen, und vor allem das Fehlen einer automatischen Skalierung (aber Selenoid ist nicht dafür). In 90% der Fälle befindet sich der Cluster im Leerlauf, und dann wird eine große Last angezeigt, die der Server nicht bewältigen kann. Es stellt sich heraus, dass Eisen sehr teuer ist, was fast immer nicht funktioniert und sogar nicht bewältigt werden kann. Ich dachte, es wäre großartig, wenn mit dem Eintreffen der Last die Anzahl der ausführbaren Browser zunehmen würde, aber wie die Last verschwindet und die Browser gelöscht werden. Glücklicherweise kann dies beispielsweise über
AWS EC2 implementiert werden.
Ein bisschen über die Struktur
- Hub
Der Hub wird überall dort gestartet, wo es für Sie am bequemsten ist. Er wird in einem Fall benötigt.
Beim Erstellen eines Docker-Containers mit einem Hub muss ihm eine Token- Umgebungsvariable übergeben werden.
Danach beginnt er eingehende Verbindungen von Knoten und Benutzern zu erwarten.
Der Hub merkt sich die Routen, speichert sie für genau eine Minute Inaktivität , löscht dann diese Route und gibt den Knoten für einen anderen Client frei.
- Knoten.
Der Knoten kann als Basiscontainer für automatische Skalierungssysteme konfiguriert werden, z. B. mit einer durchschnittlichen Auslastung des Containerpools, Hinzufügen eines weiteren oder im Extremfall können Sie beim Start einen virtuellen Server mit diesem Container starten, sofern Sie den tatsächlichen Betrag bezahlen Servernutzungszeit.
Beim Erstellen eines Docker-Containers mit einem Knoten muss die Token- und Server- Umgebungsvariable an diesen übergeben werden. Server ist die IP unseres Hubs.
Optionsnummer 1. Anfrage vom Knoten
Der Knoten sendet eine Anforderung an den Hub mit dem
gesetzten Token - dem Token aus der Umgebungsvariablen. Der Hub überprüft das Token aus der Anforderung und merkt es sich, wenn es übereinstimmt. Der Hub beginnt alle 4 Sekunden mit dem Pingen dieses Knotens. Wenn 5 Ping-Versuche fehlgeschlagen sind, wird der Knoten mit einem Hinweis auf einen Verbindungsverlust gelöscht. Der Knoten initialisiert seinerseits alle 10 Sekunden den Antwort-Ping, falls die Verbindung zum Hub unterbrochen wurde. Dies geschieht, damit der Cluster selbst nach dem Unterbrechen der Verbindung seinen Status wiederherstellt.
Optionsnummer 2. Anfrage vom Benutzer
Der Benutzer sendet eine Anfrage an den Hub, wobei die
Token- und
Nummernköpfe festgelegt sind. Das Token wird benötigt, damit nur vertrauenswürdige Knoten den Cluster betreiben können, und die Nummer, damit wir verschiedene Sitzungen innerhalb derselben Client-IP erstellen können. Jede Sitzung hat eine eigene eindeutige Nummer.
Für jede Anforderung prüft der Hub, ob bereits eine Route erstellt wurde oder nicht. Wenn dies der Fall ist, wird die Anforderung einfach an den gewünschten Knoten umgeleitet. Wenn keine solche Route vorhanden ist, wird die Anforderung des Benutzers in die Warteschlange gestellt, um den Knoten freizugeben. Sobald einer der Knoten freigegeben ist, erstellt der Hub eine Route für die Benutzersitzung und die freigegebene Route. Jetzt werden alle Anforderungen für diese Sitzung an einen bestimmten Knoten gesendet.
Eine Minute später. Wie der Benutzer die Verbindung geschlossen hat - Der Knoten wird freigegeben und an eine andere Benutzeranforderung übertragen.
Link zum Projekt-RepositoryZusammenfassung
Der Beitrag entpuppte sich eher als Gebrauchsanweisung, aber ich glaube trotzdem, dass dieses Projekt nützlich sein kann.
PS Einige Klarstellungen
Dies ist das erste Projekt, das ich auf GOLANG geschrieben habe. Wenn jemand Vorschläge oder Kommentare hat, schreibe bitte in die Kommentare (ich zähle nicht einmal auf PR, aber es wäre super cool!)