我正在實現一個簡單的循環解決方案來實現負載平衡。這個想法是一個請求將帶有一個整數值並基於該值(如果它在範圍內),我將選擇正確的過程來轉發請求。類型的負載均衡算法,地圖<範圍,列表<Process>>,有效的更新算法
創建映射
啓動時,負載均衡器會與每個進程通信並獲取支持的範圍。現在這個範圍可以重疊另一個進程的範圍或者是一個子集。
例如,考慮以下
- 方法A支持1-5
- 方法B支持1-3
- 方法C支持3-9
初始溶液I曾經創建了一個簡單的HashMap<Integer, List<Process>>
。所以我將循環遍歷範圍併爲同一個過程創建多個條目。如果某個條目已經存在,我會將新流程添加到值列表中。
訪問地圖
當一個請求到達
- 1-2,對A A & B.
- 對於3,循環賽循環賽,B &Ç
- 對於3-5,循環B & C
- 對於6-9,總是C
問題 - 更新地圖
我是罰款,直到出現了一個場景,其中我必須更新將被考慮爲將來的請求Process對象的一些參數。因此,如果必須更新Process C的參數,我必須遍歷Map的每個條目,對於每個條目,我必須通過值列表循環,並檢查列表中是否存在該過程。如果是,更新列表然後更新地圖。這是一個ConcurrentMap,這意味着當我循環時,我將在發生更新時鎖定對地圖的訪問權限。
我已經嘗試過不同的解決方案,以使更新更高效,如使用實現Comparable<Range>
的類Range(int min, int max)
,然後有NavigableMap<Range, Process>
。但是這並沒有涵蓋每個場景(重疊,範圍的子集)以正確循環,沒有間隙。
避免循環更新會很好。任何建議更好的解決方案?