Pequeno balanceador de carga em Go com suporte aos algoritmos:
- round-robin
- weighted-round-robin
- least-connection
Permite configurar porta de escuta e uma lista de backends HTTP.
cmd/main.go— ponto de entrada do load balancer.backend.go— servidor HTTP simples para testes locais (execute em outro terminal, opcional).
- Go 1.25+
git clone https://github.com/matcs/load-balancer.git
cd load-balancer
go mod tidyNo arquivo config.json no diretório do projeto com o seguinte formato:
{
"port": "8113",
"algorithm": "weighted-round-robin",
"backends": [
{ "url": "http://localhost:8081", "weight": 3 },
{ "url": "http://localhost:8082", "weight": 2 },
{ "url": "http://localhost:8083", "weight": 1 }
]
}Campos:
port: porta em que o load balancer vai escutar (ex.: "8113").algorithm: algoritmo de balanceamento. Valores aceitos:round-robin,weighted-round-robin,least-connection.backends: lista de backends HTTP.url: endereço do backend (ex.:http://localhost:8081).weight: peso relativo (usado apenas emweighted-round-robin; ignorado nos demais).
Observações:
- Em
round-robineleast-connection, o campoweighté ignorado. - Em
weighted-round-robin, pesos maiores recebem mais requisições proporcionalmente.
- Subir backends de teste (opcional)
Em um outro terminal rode instâncias do backend.go para simular serviços.
Os serviços estão configurados para as portas 8081, 8082 e 8083.
- Subir o load balancer
No diretório do projeto:
go run cmd/main.goCom o LB escutando em port (ex.: 8113):
curl -i http://localhost:8113/Envie múltiplas requisições e observe a distribuição conforme o algoritmo:
round-robin: alterna sequencialmente entre os backends.weighted-round-robin: distribui de forma proporcional aos pesos.least-connection: envia para o backend com menos conexões ativas.
-
round-robin- Seleciona backends em ordem circular.
- Simples e eficaz quando os backends têm capacidade semelhante.
-
weighted-round-robin- Variante do round-robin que considera o campo
weight. - Ex.: com pesos 3, 2 e 1, numa janela de 6 requisições a tendência é algo como 3/2/1.
- Variante do round-robin que considera o campo
-
least-connection- Direciona a próxima requisição ao backend com menos conexões ativas no momento.
- Útil quando há variação significativa no tempo de processamento por requisição.
Round-robin simples:
{
"port": "8113",
"algorithm": "round-robin",
"backends": [
{ "url": "http://localhost:8081" },
{ "url": "http://localhost:8082" }
]
}Least-connection:
{
"port": "8113",
"algorithm": "least-connection",
"backends": [
{ "url": "http://localhost:8081" },
{ "url": "http://localhost:8082" },
{ "url": "http://localhost:8083" }
]
}Weighted round-robin:
{
"port": "8113",
"algorithm": "weighted-round-robin",
"backends": [
{ "url": "http://localhost:8081", "weight": 5 },
{ "url": "http://localhost:8082", "weight": 1 }
]
}- Distribuição diferente do esperado em
weighted-round-robin: verifique os pesos e envie várias requisições para observar a proporção. least-connectionsem efeito aparente: garanta que a contagem de conexões ativas esteja sendo atualizada corretamente na sua implementação.