Ответ
Используйте балансировщик нагрузки (например, Nginx, HAProxy или cloud-решения). Основные подходы:
- Round Robin – запросы распределяются по серверам по очереди
// Упрощенный пример выбора сервера
servers := []string{"srv1", "srv2", "srv3"}
current := 0
func getServer() string {
server := servers[current]
current = (current + 1) % len(servers)
return server
}
-
Least Connections – запрос отправляется на сервер с наименьшим количеством активных соединений
-
IP Hash – клиент всегда попадает на один сервер (по хешу IP)
Для Go можно использовать встроенный ReverseProxy из net/http/httputil:
director := func(req *http.Request) {
req.URL.Scheme = "http"
req.URL.Host = getServer() // из примера выше
}
proxy := &httputil.ReverseProxy{Director: director}
http.ListenAndServe(":80", proxy)
Важно мониторить здоровье серверов и исключать нерабочие ноды из пула.