gpt4 book ai didi

go - 如何在Go中创建共享队列?

转载 作者:行者123 更新时间:2023-12-01 22:17:59 27 4
gpt4 key购买 nike

我正在尝试为负载均衡器实现最少连接算法。我正在使用优先级队列来按顺序排列每个服务器的连接数。
这是代码:

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处具有最少的调用次数,但是为什么它同时需要server和serverNumber? serverNumber似乎是服务器的唯一ID,既然您已经拥有服务器,为什么需要它?

无论如何,您应该具有所有goroutine共享的sync.Mutex,并在第一行之前锁定互斥锁,并在spq.update之后解锁,也应该在代理调用后再次锁定它,并在所有操作完成后解锁。从server.priority减去1的行仅在server是指针的情况下有效。如果不是指针,那么您将丢失在 call 期间发生的所有服务器更新。

关于go - 如何在Go中创建共享队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58123219/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com