Você não precisa de um balanceador de carga. Você precisa ajustar o modo como seu aplicativo lida com itens na fila.
-
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.
-
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".
- 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:
-
Você precisa gerar novos contêineres toda vez ou pode reutilizá-los? Isso economizaria alguns ciclos de CPU ao processar uma subtarefa.
-
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.
-
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.