如何在 Go 中创建共享队列?
How to create a shared queue in Go?
我正在尝试为负载平衡器实现最少连接算法。我正在使用优先级队列来按排序顺序保持每个服务器的连接数。
这是代码:
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
是我的优先队列。
此代码将为平衡器收到的每个请求 运行。
但是在记录每个请求的队列状态后,我没有得到正确的结果。
例如,在一种情况下,我看到队列两次包含具有不同优先级的同一服务器。
我确信这与跨请求同步和锁定队列有关。但我不确定在这种特殊情况下正确的方法是什么。
如果这确实是您在多个 goroutine 中运行的代码,那么您显然存在竞争。
我不明白spq.update。起初它看起来像是一个对队列重新排序以使服务器在元素 0 处调用次数最少的函数,但为什么它需要服务器和服务器编号? serverNumber 似乎是服务器的唯一 ID,既然您已经有了服务器,为什么还需要它?
在任何情况下,你应该有一个被所有 goroutines 共享的 sync.Mutex,并在第一行之前锁定互斥量,并在 spq.update 之后解锁,并且你应该在代理调用后再次锁定它, 完成后解锁。从 server.priority 中减去 1 的行仅在服务器是指针时才有效。如果它不是指针,您将丢失调用期间发生的对服务器的所有更新。
我正在尝试为负载平衡器实现最少连接算法。我正在使用优先级队列来按排序顺序保持每个服务器的连接数。 这是代码:
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
是我的优先队列。
此代码将为平衡器收到的每个请求 运行。 但是在记录每个请求的队列状态后,我没有得到正确的结果。 例如,在一种情况下,我看到队列两次包含具有不同优先级的同一服务器。
我确信这与跨请求同步和锁定队列有关。但我不确定在这种特殊情况下正确的方法是什么。
如果这确实是您在多个 goroutine 中运行的代码,那么您显然存在竞争。
我不明白spq.update。起初它看起来像是一个对队列重新排序以使服务器在元素 0 处调用次数最少的函数,但为什么它需要服务器和服务器编号? serverNumber 似乎是服务器的唯一 ID,既然您已经有了服务器,为什么还需要它?
在任何情况下,你应该有一个被所有 goroutines 共享的 sync.Mutex,并在第一行之前锁定互斥量,并在 spq.update 之后解锁,并且你应该在代理调用后再次锁定它, 完成后解锁。从 server.priority 中减去 1 的行仅在服务器是指针时才有效。如果它不是指针,您将丢失调用期间发生的对服务器的所有更新。