Skip to content

matcs/load-balancer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Go HTTP Load Balancer

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.

Estrutura do projeto

  • cmd/main.go — ponto de entrada do load balancer.
  • backend.go — servidor HTTP simples para testes locais (execute em outro terminal, opcional).

Requisitos

  • Go 1.25+

Instalação

git clone https://github.com/matcs/load-balancer.git
cd load-balancer
go mod tidy

Configuração

No 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 em weighted-round-robin; ignorado nos demais).

Observações:

  • Em round-robin e least-connection, o campo weight é ignorado.
  • Em weighted-round-robin, pesos maiores recebem mais requisições proporcionalmente.

Executando

  1. 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.

  1. Subir o load balancer

No diretório do projeto:

go run cmd/main.go

Testando

Com 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.

Algoritmos em detalhes

  • 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.
  • 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.

Exemplos rápidos de configs

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 }
  ]
}

Troubleshooting

  • Distribuição diferente do esperado em weighted-round-robin: verifique os pesos e envie várias requisições para observar a proporção.
  • least-connection sem efeito aparente: garanta que a contagem de conexões ativas esteja sendo atualizada corretamente na sua implementação.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages