Sobes.tech
Назад к вопросам
Junior — Middle
82

Каким образом можно осуществить балансировку трафика между серверами для оптимальной работы системы?

Компании, где спрашивали
Mail.ruMail.ru

Ответ от нейросети

sobes.tech AI

Для балансировки трафика между серверами обычно используют следующие подходы:

  1. Round Robin — простой метод, при котором запросы последовательно направляются на каждый сервер по очереди.
  2. Least Connections — запрос направляется на сервер с наименьшим количеством активных соединений.
  3. IP Hash — выбор сервера на основе хэширования IP клиента, что обеспечивает сессию на одном сервере.

В Go можно использовать готовые решения, например, встроенный пакет net/http/httputil с ReverseProxy для создания балансировщика, или внешние инструменты (NGINX, HAProxy).

Пример простого балансировщика на Go с 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))
}

Такой балансировщик будет последовательно перенаправлять запросы на сервера из списка.