我正在嘗試為負載均衡器實現(xiàn)最少連接算法。我正在使用優(yōu)先級隊列來按排序順序保留每個服務器的連接數(shù)。這是代碼: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我的優(yōu)先隊列在哪里。此代碼將針對平衡器收到的每個請求運行。但在記錄每個請求的隊列狀態(tài)后,我沒有得到正確的結(jié)果。例如,在一種情況下,我看到隊列包含兩次具有不同優(yōu)先級的同一服務器。我確信這與跨請求同步和鎖定隊列有關(guān)。但我不確定在這種特殊情況下正確的方法是什么。
1 回答

慕的地10843
TA貢獻1785條經(jīng)驗 獲得超8個贊
如果這確實是您在多個 goroutine 中運行的代碼,那么您顯然會遇到競爭。
我不明白 spq.update。乍一看,它看起來像是一個對隊列進行重新排序的函數(shù),以使服務器在元素 0 處具有最少調(diào)用次數(shù),但是為什么它同時需要 server 和 serverNumber 呢?serverNumber 似乎是服務器的唯一 ID,既然您已經(jīng)擁有服務器,為什么還需要它?
無論如何,你應該有一個由所有 goroutine 共享的sync.Mutex,并在第一行之前鎖定互斥鎖,并在 spq.update 之后解鎖,還應該在代理調(diào)用后再次鎖定它,并在完成后解鎖。僅當 server 是指針時,從 server.priority 中減去 1 的行才有效。如果它不是指針,您將丟失調(diào)用期間發(fā)生的所有服務器更新。
- 1 回答
- 0 關(guān)注
- 91 瀏覽
添加回答
舉報
0/150
提交
取消