Equilibrio de carga al analizar sitios y conectar recursos en la nube adicionales

En esta publicación, hablaremos sobre una biblioteca que registra nodos en sí misma y redirige las solicitudes desde el exterior a un nodo específico.

¿Cómo surgió la idea de escribir este proyecto?


Después de que hubo una necesidad de analizar sitios en grandes cantidades, traté de implementar tal cosa usando la cuadrícula de selenio, luego tomé selenoid. surgió selenoid, pero había muchas cosas que no necesitaba, por ejemplo, versiones y opciones de navegador, y lo más importante, la falta de escala automática (pero selenoid no es para eso). El 90% del tiempo el clúster está inactivo, y luego aparece una gran carga, que el servidor no puede hacer frente. Resulta grandes gastos para el hierro, que casi todo el tiempo no funciona, e incluso no puede hacer frente. Pensé que sería genial si, a medida que llegara la carga, aumentara el número de navegadores ejecutables, pero cómo desaparece la carga y se eliminan los navegadores. Afortunadamente, esto se puede implementar, por ejemplo, a través de AWS EC2 .


Un poco sobre la estructura.


  • Hub

    El hub se inicia donde sea conveniente para usted, es necesario en una instancia.
    Al crear un contenedor acoplable con un concentrador, debe pasarle una variable de entorno de token .

    Después de lo cual comienza a esperar conexiones entrantes de nodos y de usuarios.
    El concentrador recuerda las rutas, las recuerda durante exactamente un minuto de inactividad , luego elimina esta ruta y libera el nodo para otro cliente.
  • Nodo

    El nodo se puede configurar como un contenedor básico para sistemas de escalado automático, por ejemplo, con una carga promedio en el grupo de contenedores, agregar otro, o, en casos extremos, puede iniciar un servidor virtual con este contenedor en el momento del lanzamiento, siempre que pague el costo real tiempo de uso del servidor.

    Al crear un contenedor acoplable con un nodo, debe pasarle el token y la variable de entorno del servidor . El servidor es la ip de nuestro hub.


Opción número 1. Solicitud del nodo


El nodo realiza una solicitud al concentrador con el conjunto de tokens , que es el token de la variable de entorno. El concentrador verifica el token de la solicitud y, si coinciden, lo recuerda. El concentrador comienza a hacer ping a este nodo una vez cada 4 segundos. Si fallaron 5 intentos de ping, el nodo se elimina con una nota de pérdida de conexión. El nodo, a su vez, inicializa el ping de respuesta, una vez cada 10 segundos, en caso de que se pierda la conexión con el concentrador. Esto se hace para que después de que se rompa la conexión, el clúster mismo restablezca su estado.

Opción número 2. Solicitud del usuario


El usuario realiza una solicitud al concentrador con el token y los encabezados numéricos establecidos. El token es necesario para que solo los nodos de confianza puedan operar el clúster, y el número para que podamos crear diferentes sesiones dentro de la misma IP del cliente. Cada sesión tiene su propio número único.

Para cada solicitud, el concentrador verifica si ya hay una ruta creada o no, si la hay, la solicitud simplemente se redirige al nodo deseado, si no existe dicha ruta, la solicitud del usuario se pone en cola para liberar el nodo. Tan pronto como se libera uno de los nodos, el concentrador crea una ruta para la sesión del usuario y la ruta liberada. Ahora todas las solicitudes para esta sesión irán a un nodo específico.

Un minuto despues. cómo el usuario cerró la conexión: el nodo se libera y se transfiere a la solicitud de otro usuario.

Enlace al repositorio del proyecto

Resumen


La publicación resultó ser más como instrucciones de uso, pero sin embargo, creo que este proyecto puede ser útil.

PD Algunas aclaraciones


Este es el primer proyecto que comencé a escribir en GOLANG, en relación con el cual, si alguien tiene sugerencias o comentarios, escriba los comentarios (¡ni siquiera cuento con relaciones públicas, pero sería genial!)

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


All Articles