2011-10-15 45 views
0

我正在實現一個簡單的循環解決方案來實現負載平衡。這個想法是一個請求將帶有一個整數值並基於該值(如果它在範圍內),我將選擇正確的過程來轉發請求。類型的負載均衡算法,地圖<範圍,列表<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>。但是這並沒有涵蓋每個場景(重疊,範圍的子集)以正確循環,沒有間隙。

避免循環更新會很好。任何建議更好的解決方案?

回答

0

你試過LinkedHashMap嗎?樹形圖也可能有助於你的情況。此外,還有一個Commons集合MultiKeyHashMap,它允許您爲單個值維護多個鍵。

相關問題