Я пытаюсь реализовать алгоритм наименьшего количества соединений для балансировщика нагрузки.Я использую приоритетную очередь, чтобы сохранить количество соединений на сервер в отсортированном порядке.Вот код:
server = spq[0]
serverNumber = server.value
updatedPriority = server.priority + 1 // Increment connection count for server
spq.update(server, serverNumber, updatedPriority)
targetUrl, err := url.Parse(configuration.Servers[serverNumber])
if err != nil {
log.Fatal(err)
}
// Send the request to the selected server
httputil.NewSingleHostReverseProxy(targetUrl).ServeHTTP(w, r)
updatedPriority = server.priority - 1 // Decrement connection count for server
spq.update(server, serverNumber, updatedPriority)
, где spq
- моя очередь с приоритетами.
Этот код будет выполняться для каждого запроса, который получит балансировщик.Но я не получаю правильные результаты после регистрации состояния очереди для каждого запроса.Например, в одном случае я видел, что очередь содержала один и тот же сервер дважды с разными приоритетами.
Я уверен, что это как-то связано с синхронизацией и блокировкой очереди между запросами.Но я не уверен, каков правильный подход в данном конкретном случае.