Contêineres do Docker com dimensionamento automático baseados no carregamento da instância do EC2 e no SQS

4

Vou começar com uma pequena descrição de como meu aplicativo funciona.

Se um usuário em meu site adicionar uma tarefa, a tarefa será dividida em várias sub-tarefas. O número pode variar de 1 a 10 tarefas. Essas 10 tarefas são adicionadas à fila do SQS. Eu tenho uma instância do Ubuntu EC2 executando node.js e docker.

O Node.js está configurado para ouvir a fila e, uma vez recebida a mensagem de subtarefa, ela gera um contêiner docker que, por sua vez, executa a subtarefa. Quando a subtarefa estiver concluída, o contêiner será destruído.

Eu tenho uma instância EC2 c4.2xlarge que executa o processo acima sem problemas para uma tarefa (10 sub-tarefas). No entanto, o problema surge quando várias tarefas são adicionadas ao mesmo tempo. Digamos que eu faça um teste de 10 tarefas, que são divididas em 100 sub-tarefas, o servidor experimenta uma carga severa durante o lançamento dos contêineres.

Como faço para escalar esse ambiente?

Eu estive pensando em reservar um pool de instâncias paradas do EC2, sim "Stopped" porque o atraso para gerar uma nova instância é muito alto e eu gostaria de consumir as sub-tarefas na fila o mais rápido possível sem ter para suportar o custo de executar um servidor 24/7.

Está escrevendo um balanceador de carga em node.js com base em recursos / número de mensagens na fila o melhor caminho a seguir?

    
por dylanfa88 24.07.2015 / 13:07

2 respostas

2

Você não precisa de um balanceador de carga. Você precisa ajustar o modo como seu aplicativo lida com itens na fila.

  1. Avalie seu aplicativo em vários tamanhos de instância para determinar o número ideal / máximo de tarefas que ele pode gerenciar simultaneamente. Para fins de ilustração, digamos que o número seja 20.

  2. Altere seu aplicativo para extrair no máximo 20 itens da fila, nunca mais. Quando uma das 20 subtarefas estiver concluída, ela poderá voltar para a fila por mais tempo.

Neste ponto, seu servidor de trabalhador único não deve "sobrecarregar". Vai demorar um pouco para trabalhar em uma grande fila de itens.

Você precisa ter esse limite para evitar sua "carga grave durante o lançamento dos contêineres".

  1. Use os alertas do CloudWatch para adicionar mais instâncias do trabalhador à medida que sua fila fica muito grande e para encerrar instâncias à medida que a fila fica menor. Cada instância processará 20 por vez.

Depois de ter isso, você pode fazer algumas otimizações:

  1. Você precisa gerar novos contêineres toda vez ou pode reutilizá-los? Isso economizaria alguns ciclos de CPU ao processar uma subtarefa.

  2. Você pode usar instâncias do EC2 em um estado interrompido em vez de gerar instâncias novas. Mas você teria que fazer um tratamento personalizado do seu alerta CloudWatch para isso, mas isso poderia ser feito. Você deseja ter um ouvinte no SNS aguardando os alertas, no ponto em que ele pode iniciar e interromper as instâncias do EC2 conforme necessário.

  3. Avalie seu aplicativo usando vários tamanhos de instância. É possível que usar dois c4.xlarge seja melhor do que usar um c4.2xlarge. Experimente e experimente diferentes combinações.

por 24.07.2015 / 18:36
0

Isso agora pode ser feito com a tecnologia sem servidor, as funções do AWS Lambda e o AWS SNS ou SQS.

link

Por exemplo, a Tarefa pode acionar o SNS, que pode enviá-lo para o Lambda, onde sua função será dimensionada automaticamente com base na demanda.

    
por 30.11.2018 / 21:07