Как сбалансировать нагрузку на серверы при горизонтальном масштабировании

«Как сбалансировать нагрузку на серверы при горизонтальном масштабировании» — вопрос из категории DevOps, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Используйте балансировщик нагрузки (например, Nginx, HAProxy или cloud-решения). Основные подходы:

  1. Round Robin – запросы распределяются по серверам по очереди
// Упрощенный пример выбора сервера
servers := []string{"srv1", "srv2", "srv3"}
current := 0

func getServer() string {
    server := servers[current]
    current = (current + 1) % len(servers)
    return server
}
  1. Least Connections – запрос отправляется на сервер с наименьшим количеством активных соединений

  2. 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)

Важно мониторить здоровье серверов и исключать нерабочие ноды из пула.