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:
- Round Robin — metodă simplă în care solicitările sunt trimise secvențial către fiecare server.
- Cele mai puține conexiuni — solicitarea este direcționată către serverul cu cel mai mic număr de conexiuni active.
- 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(¤t, 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ă.