Balanceamento de carga ao analisar sites e conectar recursos adicionais da nuvem

Neste post, falaremos sobre uma biblioteca que registra nós em si e redireciona solicitações de fora para um nó específico.

Como você teve a ideia de escrever este projeto?


Depois que havia a necessidade de analisar sites em grandes quantidades, tentei implementar isso usando a grade de selênio e, em seguida, tomei o selenóide. o selenoid surgiu, mas havia muito que eu não precisava, por exemplo, versões e opções do navegador e, o mais importante, a falta de dimensionamento automático (mas o selenoid não é para isso). 90% do tempo em que o cluster está ocioso e, em seguida, uma grande carga é exibida, com a qual o servidor não consegue lidar. Acontece grandes despesas com ferro, que quase o tempo todo não funcionam e nem conseguem aguentar. Eu pensei que seria ótimo se, à medida que a carga chegasse, o número de navegadores executáveis ​​aumentasse, mas como a carga desaparece e os navegadores são excluídos. Felizmente, isso pode ser implementado, por exemplo, através do AWS EC2 .


Um pouco sobre a estrutura


  • Hub

    O hub é lançado sempre que conveniente para você, é necessário em uma instância.
    Ao criar um contêiner de docker com um hub, ele precisa passar uma variável de ambiente do token para ele.

    Depois disso, ele começa a esperar conexões de entrada de nós e de usuários.
    O hub lembra as rotas, lembra-as por exatamente um minuto de inatividade , remove a rota e libera o nó para outro cliente.


  • O nó pode ser configurado como um contêiner básico para sistemas de dimensionamento automático, por exemplo, com uma carga média no pool de contêineres, adicionar outro ou, em casos extremos, você pode iniciar um servidor virtual com esse contêiner no momento da inicialização, desde que pague o valor real tempo de uso do servidor.

    Ao criar um contêiner de docker com um nó, ele precisa passar a variável de ambiente do token e do servidor para ele. Servidor é o ip do nosso hub.


Opção número 1. Solicitação do nó


O nó faz uma solicitação ao hub com o conjunto de tokens - que é o token da variável de ambiente. O hub verifica o token da solicitação e, se eles corresponderem, ele se lembra. O hub começa a executar ping neste nó a cada 4 segundos. Se cinco tentativas de ping falharem, o nó será excluído com uma nota de perda de conexão. O nó, por sua vez, inicializa o ping da resposta, uma vez a cada 10 segundos, caso a conexão com o hub tenha sido perdida. Isso é feito para que, depois que a conexão seja interrompida, o próprio cluster restaurará seu estado.

Opção número 2. Solicitação do usuário


O usuário faz uma solicitação ao hub com o token e o número de cabeçalhos definidos. O token é necessário para que apenas nós confiáveis ​​possam operar o cluster e número para que possamos criar sessões diferentes dentro do mesmo IP do cliente. Cada sessão tem seu próprio número exclusivo.

Para cada solicitação, o hub verifica se já existe uma rota criada ou não, se houver - a solicitação é simplesmente redirecionada para o nó desejado, se não houver essa rota, a solicitação do usuário é enfileirada para liberar o nó. Assim que um dos nós é liberado, o hub faz uma rota para a sessão do usuário e a rota liberada. Agora todos os pedidos para esta sessão irão para um nó específico.

Um minuto depois. como o usuário encerrou a conexão - o nó é liberado e transferido para outra solicitação do usuário.

Link para o repositório do projeto

Sumário


O post acabou sendo mais como instruções de uso, mas, no entanto, acredito que este projeto pode ser útil.

PS Alguns esclarecimentos


Este é o primeiro projeto que comecei a escrever no GOLANG, em relação ao qual, se alguém tiver sugestões ou comentários, escreva nos comentários (eu nem conto com PR, mas seria super legal!)

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


All Articles