类型的负载均衡算法,Map <range,list <process =“”>&gt;,一种有效的更新算法</range,>

时间:2011-10-15 18:13:48

标签: java algorithm data-structures range

我正在实施一个简单的循环解决方案来实现负载平衡。这个想法是一个请求将带有一个整数值并基于该值(如果它在Range范围内),我将选择正确的转发请求的过程。

制作地图
启动时,负载均衡器会与每个进程进行通信并获得支持的范围。现在,此范围可以与另一个进程的Range重叠或成为子集。

例如,请考虑以下内容

  • 流程A支持1-5
  • 流程B支持1-3
  • 流程C支持3-9

我的初始解决方案是创建一个简单的HashMap<Integer, List<Process>>。因此,我将循环遍历范围并为同一进程创建多个条目。如果密钥已存在,我将把新流程添加到值列表中。

访问地图
当请求进来时

  • 1-2,循环赛A&amp; B.
  • 3,A,B&amp ;; C
  • 对于3-5,B&amp; B上的循环赛C
  • 6-9,总是C

问题 - 更新地图
我很好,直到出现一个场景,其中我必须更新Process对象中的一些参数,这些参数将被考虑用于将来的请求。因此,如果必须更新进程C的参数,我必须循环遍历Map的每个条目,对于每个条目,我必须遍历值列表并检查列表中是否存在该进程。如果是,请更新列表,然后更新地图。这是一个ConcurrentMap,这意味着当我循环时,我将在更新发生时锁定对map的访问。

我尝试了不同的解决方案,使更新更有效,就像使用实现Range(int min, int max)然后拥有Comparable<Range>的类NavigableMap<Range, Process>一样。但是这并没有覆盖每个场景(重叠,范围的子集)到没有间隙的正确循环。

避免更新循环会很好。有关更好解决方案的任何建议吗?

1 个答案:

答案 0 :(得分:0)

您是否尝试过LinkedHashMap? treeMap也可能对您的情况有所帮助。此外,还有一个公共集合MultiKeyHashMap,它允许您为单个值维护多个键。