如何在 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我的优先队列在哪里。


此代码将针对平衡器收到的每个请求运行。但在记录每个请求的队列状态后,我没有得到正确的结果。例如,在一种情况下,我看到队列包含两次具有不同优先级的同一服务器。


我确信这与跨请求同步和锁定队列有关。但我不确定在这种特殊情况下正确的方法是什么。


白衣非少年
浏览 63回答 1
1回答

慕的地10843

如果这确实是您在多个 goroutine 中运行的代码,那么您显然会遇到竞争。我不明白 spq.update。乍一看,它看起来像是一个对队列进行重新排序的函数,以使服务器在元素 0 处具有最少调用次数,但是为什么它同时需要 server 和 serverNumber 呢?serverNumber 似乎是服务器的唯一 ID,既然您已经拥有服务器,为什么还需要它?无论如何,你应该有一个由所有 goroutine 共享的sync.Mutex,并在第一行之前锁定互斥锁,并在 spq.update 之后解锁,还应该在代理调用后再次锁定它,并在完成后解锁。仅当 server 是指针时,从 server.priority 中减去 1 的行才有效。如果它不是指针,您将丢失调用期间发生的所有服务器更新。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go