Sobes.tech
Junior — Middle

Cum se poate realiza echilibrarea traficului între servere pentru funcționarea optimă a sistemului?

sobes.tech AI

Răspuns de la AI

Pentru echilibrarea traficului între servere, de obicei se utilizează următoarele abordări:

  1. Round Robin — metodă simplă în care solicitările sunt trimise secvențial către fiecare server.
  2. Cele mai puține conexiuni — solicitarea este direcționată către serverul cu cel mai mic număr de conexiuni active.
  3. Hash IP — selecția serverului bazată pe hash-ul IP-ului clientului, asigurând o sesiune pe un singur server.

În Go, se pot folosi soluții gata făcute, precum pachetul încorporat net/http/httputil cu ReverseProxy pentru crearea unui load balancer, sau instrumente externe (NGINX, HAProxy).

Exemplu de un load balancer simplu în Go cu Round Robin:

package main

import (
    "log"
    "net/http"
    "net/http/httputil"
    "net/url"
    "sync/atomic"
)

var servers = []string{
    "http://localhost:8081",
    "http://localhost:8082",
}

var current uint32

func getNextServer() *url.URL {
    idx := atomic.AddUint32(&current, 1)
    serverURL, _ := url.Parse(servers[int(idx)%len(servers)])
    return serverURL
}

func handler(w http.ResponseWriter, r *http.Request) {
    target := getNextServer()
    proxy := httputil.NewSingleHostReverseProxy(target)
    proxy.ServeHTTP(w, r)
}

func main() {
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Acest load balancer va redirecționa solicitările secvențial către serverele din listă.