分布式负载均衡算法,阿里云的负载均衡slb
云SLB负载平衡
假设当一个云为用户提供服务器时,准备好的服务器会被添加到一个使用池中,用户一次只能使用池中的服务器。为了平衡负载,每次用户要使用时,都会选择第一台服务器使用。请实现以下四个函数来实现负载均衡:添加函数,提供服务器ID,系统会将服务器加入使用池,假设初始状态下使用池中没有服务器。删除功能,提供服务器ID,系统将从使用池中删除具有该ID的服务器。Select函数,在用户每次使用服务器时调用,从使用池中选择最早未被占用的服务器并返回其ID。当没有可用的服务器时,将返回使用池中的服务器数量。release函数在用户每次返回服务器时被调用,它释放用户使用的服务器。进入一个二维数组,每个一维数组的第一个元素代表被调用的函数,1代表add函数的调用,下一个元素代表ID;2表示调用删除函数,后面是ID的元素;3表示调用select函数;4表示调用release函数,后面跟一个ID的元素。
示例1输入:
[[1,1],[1,2],[1,3],[3],[2,1],[3],[4,2],[3]]复制返回值:
[1,2,3,2]复制说明:
首先,向使用池中添加三台服务器。用户依次使用前两个服务器。删除使用池中的第一台服务器。用户将继续使用第三台服务器。归还第二台服务器后,用户将使用第二台服务器。问题的解决方法很简单,但是描述不清楚。类似于LRU,用一个自由集合来表示可用的机器,用一个使用集合来表示正在使用的机器,用一个哈希表来存储id和所有集合中元素的映射关系,以便根据id来查找。
想法:
1.定义节点,存储id和时间戳。id是标题中输入的id,时间戳初始化为1,每次操作都会递增。当它被插入时,节点的时间戳将被更新。
2.为节点定义一个比较函数。比较的标准是timestamp的大小,free_set和use_set都使用,这样第一个取出的元素就是第一个加入的机器。
3.添加操作:判断id是否已经在哈希表中,如果不在则插入free_set,更新hash[id]插入返回的迭代器。
4.删除操作:判断hash[id]是否存在,如果存在则从free_set或use_set中删除,然后从hash中删除。
5.select操作:如果free_set为空,返回use_sets的个数,否则,返回free_set对应的set.begin,将机器移动到use _ set,然后更新hash[id]
6 .释放操作:从use_set中删除id为的机器,然后将其放入free_set,并更新hash[id]
代码如下:
结构节点
{
int id
int时间戳;
};
类别比较_对象
{
公共:
bool运算符()(常量节点左,常量节点右)
{
return left . timestamp right . timestamp;
}
};
类别解决方案
{
公共:
向量int SLB(向量向量int运算符)
{
int time=0;
std:set节点,compare _ obj free _ set
std:unordered_map int,STD:set node:iterator hash;
std:set节点,compare _ obj use _ set
STD:vector int ans;
for(自动v:运算符)
{
int op=v[0];
时间;
if (op==1) //add
{
if (hash.find(v[1])==hash.end())
{
节点n;
n . id=v[1];
n .时间戳=时间;
hash[n . id]=free _ set . insert(free _ set . begin(),n);
}
}
else if (op==2) //删除
{
int id=v[1];
if (hash.find(id)!=hash.end())
{
if (free_set.find(*hash[id])!=free_set.end()
{
free _ set . erase(hash[id]);
}
else if (use_set.find(*hash[id])!=use_set.end())
{
use _ set . erase(hash[id]);
}
hash . erase(id);
}
}
else if (op==3) //select
{
if (free_set.empty())
{
ans . push _ back(use _ set . size());
}
其他
{
auto it=free _ set . begin();
ans . push _ back(it-id);
hash[it-id]=use _ set . insert(use _ set . begin(),* it);
free _ set . erase(it);
}
}
else if (op==4) //释放
{
int id=v[1];
if (hash.find(id)!=hash.end())
{
auto n=* hash[id];
use _ set . erase(hash[id]);
hash[id]=free _ set . insert(free _ set . begin(),n);
}
}
}
返回ans
}
};
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。