为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
白衣非少年 2023-07-26 17:02:11
我正在尝试为负载均衡器实现最少连接算法。我正在使用优先级队列来按排序顺序保留每个服务器的连接数。这是代码: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 的行才有效。如果它不是指针,您将丢失调用期间发生的所有服务器更新。


查看完整回答
反对 回复 2023-07-26
  • 1 回答
  • 0 关注
  • 62 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信