Équilibrage de charge lors de l'analyse de sites et de la connexion de ressources cloud supplémentaires

Dans cet article, nous parlerons d'une bibliothèque qui enregistre les nœuds en elle-même et redirige les demandes de l'extérieur vers un nœud spécifique.

Comment vous est venue l'idée d'écrire ce projet?


Après avoir eu besoin d'analyser des sites en grande quantité, j'ai essayé d'implémenter une telle chose en utilisant une grille de sélénium, puis j'ai pris du sélénoïde. selenoid est apparu, mais il y avait beaucoup de choses dont je n'avais pas besoin, par exemple, les versions et les options du navigateur, et surtout, le manque de mise à l'échelle automatique (mais selenoid n'est pas pour cela). 90% du temps, le cluster est inactif, puis une grosse charge apparaît, que le serveur ne peut pas supporter. Il en résulte de grosses dépenses pour le fer, qui ne fonctionne presque pas tout le temps et ne peut même pas y faire face. Je pensais que ce serait génial si, à mesure que la charge arrivait, le nombre de navigateurs exécutables augmenterait, mais comment la charge disparaît et les navigateurs sont supprimés. Heureusement, cela peut être implémenté, par exemple, via AWS EC2 .


Un peu sur la structure


  • Hub

    Le hub est lancé partout où cela vous convient, il est nécessaire dans un cas.
    Lors de la création d'un conteneur Docker avec un concentrateur, il doit lui transmettre une variable d'environnement de jeton .

    Après quoi, il commence à attendre les connexions entrantes des nœuds et des utilisateurs.
    Le concentrateur se souvient des itinéraires, il les mémorise pendant exactement une minute d' inactivité , puis il supprime cet itinéraire et libère le nœud pour un autre client.
  • Noeud.

    Le nœud peut être configuré comme conteneur de base pour les systèmes de mise à l'échelle automatique, par exemple, avec une charge moyenne sur le pool de conteneurs, en ajouter un autre ou, dans les cas extrêmes, vous pouvez démarrer un serveur virtuel avec ce conteneur au moment du lancement, à condition que vous payiez le temps d'utilisation du serveur.

    Lors de la création d'un conteneur Docker avec un nœud, il doit lui transmettre la variable d'environnement de jeton et de serveur . Le serveur est l'IP de notre hub.


Numéro d'option 1. Demande du nœud


Le nœud fait une demande au concentrateur avec l' ensemble de jetons - qui est le jeton de la variable d'environnement. Le concentrateur vérifie le jeton de la demande et s'il correspond, il s'en souvient. Le concentrateur commence à envoyer une requête ping à ce nœud toutes les 4 secondes. Si 5 tentatives de ping échouent, le nœud est supprimé avec une note de perte de connexion. Le nœud, à son tour, initialise le ping de réponse, une fois toutes les 10 secondes, au cas où la connexion avec le concentrateur serait perdue. Cela est fait de sorte qu'après la connexion est rompue, le cluster lui-même restaure son état.

Numéro d'option 2. Demande de l'utilisateur


L'utilisateur fait une demande au concentrateur avec les en-têtes de jeton et de numéro définis. Le jeton est nécessaire pour que seuls les nœuds approuvés puissent faire fonctionner le cluster, et le numéro afin que nous puissions créer différentes sessions au sein de la même adresse IP client. Chaque session a son propre numéro unique.

Pour chaque demande, le concentrateur vérifie s'il existe déjà un itinéraire créé ou non, s'il y en a un - la demande est simplement redirigée vers le nœud souhaité, s'il n'y a pas un tel itinéraire, la demande de l'utilisateur est mise en file d'attente pour libérer le nœud. Dès qu'un des nœuds est libéré, le concentrateur établit un itinéraire pour la session utilisateur et l'itinéraire libéré. Maintenant, toutes les demandes pour cette session iront à un nœud spécifique.

Une minute plus tard. comment l'utilisateur a fermé la connexion - le nœud est libéré et transféré à une autre demande d'utilisateur.

Lien vers le référentiel du projet

Résumé


Le message s'est avéré être plutôt un mode d'emploi, mais je pense néanmoins que ce projet peut être utile.

PS Quelques clarifications


Ceci est le premier projet que j'ai commencé à écrire sur GOLANG, à propos duquel, si quelqu'un a des suggestions ou des commentaires, veuillez écrire dans les commentaires (je ne compte même pas sur les relations publiques, mais ce serait super cool!)

Source: https://habr.com/ru/post/fr420303/


All Articles