我正在尝试为负载均衡器实现最少连接算法。我正在使用优先级队列来按排序顺序保留每个服务器的连接数。这是代码:server = spq[0]serverNumber = server.valueupdatedPriority = server.priority + 1 // Increment connection count for serverspq.update(server, serverNumber, updatedPriority)targetUrl, err := url.Parse(configuration.Servers[serverNumber])if err != nil { log.Fatal(err)}// Send the request to the selected serverhttputil.NewSingleHostReverseProxy(targetUrl).ServeHTTP(w, r)updatedPriority = server.priority - 1 // Decrement connection count for serverspq.update(server, serverNumber, updatedPriority)spq我的优先队列在哪里。此代码将针对平衡器收到的每个请求运行。但在记录每个请求的队列状态后,我没有得到正确的结果。例如,在一种情况下,我看到队列包含两次具有不同优先级的同一服务器。我确信这与跨请求同步和锁定队列有关。但我不确定在这种特殊情况下正确的方法是什么。
1 回答
慕的地10843
TA贡献1785条经验 获得超8个赞
如果这确实是您在多个 goroutine 中运行的代码,那么您显然会遇到竞争。
我不明白 spq.update。乍一看,它看起来像是一个对队列进行重新排序的函数,以使服务器在元素 0 处具有最少调用次数,但是为什么它同时需要 server 和 serverNumber 呢?serverNumber 似乎是服务器的唯一 ID,既然您已经拥有服务器,为什么还需要它?
无论如何,你应该有一个由所有 goroutine 共享的sync.Mutex,并在第一行之前锁定互斥锁,并在 spq.update 之后解锁,还应该在代理调用后再次锁定它,并在完成后解锁。仅当 server 是指针时,从 server.priority 中减去 1 的行才有效。如果它不是指针,您将丢失调用期间发生的所有服务器更新。
- 1 回答
- 0 关注
- 60 浏览
添加回答
举报
0/150
提交
取消