我正在实施一个简单的循环解决方案来实现负载平衡。这个想法是一个请求将带有一个整数值并基于该值(如果它在Range范围内),我将选择正确的转发请求的过程。
制作地图
启动时,负载均衡器会与每个进程进行通信并获得支持的范围。现在,此范围可以与另一个进程的Range重叠或成为子集。
例如,请考虑以下内容
我的初始解决方案是创建一个简单的HashMap<Integer, List<Process>>
。因此,我将循环遍历范围并为同一进程创建多个条目。如果密钥已存在,我将把新流程添加到值列表中。
访问地图
当请求进来时
问题 - 更新地图
我很好,直到出现一个场景,其中我必须更新Process对象中的一些参数,这些参数将被考虑用于将来的请求。因此,如果必须更新进程C的参数,我必须循环遍历Map的每个条目,对于每个条目,我必须遍历值列表并检查列表中是否存在该进程。如果是,请更新列表,然后更新地图。这是一个ConcurrentMap,这意味着当我循环时,我将在更新发生时锁定对map的访问。
我尝试了不同的解决方案,使更新更有效,就像使用实现Range(int min, int max)
然后拥有Comparable<Range>
的类NavigableMap<Range, Process>
一样。但是这并没有覆盖每个场景(重叠,范围的子集)到没有间隙的正确循环。
避免更新循环会很好。有关更好解决方案的任何建议吗?
答案 0 :(得分:0)
您是否尝试过LinkedHashMap? treeMap也可能对您的情况有所帮助。此外,还有一个公共集合MultiKeyHashMap,它允许您为单个值维护多个键。