分布式负载均衡算法,阿里云的负载均衡slb

  分布式负载均衡算法,阿里云的负载均衡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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 阿里云盘怎么看是不是永久,阿里云盘永久免费空间多大
  • ,,详解阿里云视频直播PHP-SDK接入教程
  • ,,解析阿里云centos7服务器nginx配置及常见问题解答
  • ,,maven配置阿里云仓库的实现方法(2022年)
  • 阿里云 access key,阿里云accesskeyid
  • 阿里云docker 容器镜像 仓库,docker自建镜像仓库
  • 阿里云盘邀请码使用方法教程,阿里云盘邀请码使用方法大全
  • 阿里云计算平台,阿里实时计算开发平台
  • 阿里云远程桌面连接不上解决方法视频,阿里云远程桌面连接不上解决方法怎么回事
  • 阿里云盘福利码提示错误解决方法是什么,阿里云盘福利码提示错误解决方法怎么办
  • 阿里云如何购买学生服务器,学生阿里云服务器购买教程
  • 阿里云网盘下载文件位置,阿里云盘下载在哪
  • 阿里云虚拟主机nginx配置,nginx 服务器配置
  • 云服务器操作系统选哪个,阿里云是操作系统吗
  • 阿里云盘免费领取方案怎么弄,阿里云盘怎么领
  • 留言与评论(共有 条评论)
       
    验证码: