Sobes.tech
Back to questions
Junior — Middle
84

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

Companies where asked
Mail.ruMail.ru

Answer from AI

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))
}

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