博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现一个简单的轮询算法
阅读量:5740 次
发布时间:2019-06-18

本文共 2078 字,大约阅读时间需要 6 分钟。

前言

负载均衡,大家应该听的也不少了,也实践过N次了。

当然也会知道,负载均衡是有不少算法的:随机,轮询,加权轮询,最少连接。。。。

本文重点说的是轮询。

先举个例子看看轮询算法是如何运作的。

假设我们的API站点有3台负载(10.0.10.1,10.0.10.2和10.0.10.3),客户端第一次请求API的时候,会访问.1拿到结果,第二次会访问.2拿到结果,第三次则会访问.3拿到结果,后面就是依次类推。

在致就是这个样子的访问顺序。

.1->.2->.3>.1>.2......

当然,上面的情况是太太太理想了!!只是能帮助我们理解轮询是怎么一回事!

下面是比较官方的描述:

按顺序把每个新的连接请求分配给下一个服务器,最终把所有请求平分给所有的服务器。

下面来简单看看如何实现

简单实现

我们围绕的重点如下:

  1. 服务器列表
  2. 上一次访问的是那台机器
  3. 下一次要访问的是那台机器

下面是实现

public class RoundRobin
{ //服务器列表 private readonly IList
_items; //锁 private readonly object _syncLock = new object(); //当前访问的服务器索引,开始是-1,因为没有人访问 private int _currentIndex = -1; public RoundRobin(IEnumerable
sequence) { _items = sequence.ToList(); if(_items.Count <= 0 ) { throw new ArgumentException("Sequence contains no elements.", nameof(sequence)); } } public T GetNextItem() { lock (this._syncLock) { _currentIndex++; //超过数量,索引归0 if (_currentIndex >= _items.Count) _currentIndex = 0; return _items[_currentIndex]; } }}

根据用户不同的设计,服务器有可能是一个字符串,也有可能是自定义的一个类,所以设计成泛型参数会比较合适。

下面测试一下

static void Main(string[] args){    //负载的api地址    var lbUrls = new List
{ "http://10.0.10.1/api/values", "http://10.0.10.2/api/values", "http://10.0.10.3/api/values", "http://10.0.10.4/api/values", }; //构造轮询的对象 var robin = new RoundRobin
(lbUrls); //访问次数 var visitCount = lbUrls.Count * new Random().Next(3, 5); //常规的情况 Console.WriteLine("begin one by one.."); for (int i = 0; i < visitCount; i++) { Console.WriteLine($"{i + 1}:Sending request to {robin.GetNextItem()}"); } //并行的情况 Console.WriteLine("begin parallel.."); Parallel.For(0, visitCount, i => { Console.WriteLine($"{i + 1}:Sending request to {robin.GetNextItem()}"); }); Console.ReadKey();}

结果:

558945-20180317101934468-766903501.jpg

示例代码:

转载于:https://www.cnblogs.com/catcher1994/p/simple_roundrobin.html

你可能感兴趣的文章
clearance 编辑个人用户信息界面
查看>>
本地消息通知
查看>>
ptmalloc——smallbin/largebin/unsortedbin
查看>>
IBInspectable / IBDesignable可视化控件编程讲解/使用/封装
查看>>
Ionic 取消自带动画效果
查看>>
phpmyadmin查询操作中文乱码
查看>>
话说对 Hibernate 的吐槽很没道理,我竟无言以对
查看>>
window远程mstsc使用ssh代理
查看>>
1065 A+B and C(64bit)
查看>>
设计模式adapter
查看>>
关于@Configuration和@Bean的新发现
查看>>
MYSQL之旅
查看>>
Yii框架学习(一)
查看>>
pthread_cancel,pthread_killall 段错误
查看>>
iphone:plist的读写存!
查看>>
如何将自己的程序发布到iphone App store上
查看>>
字符串部分字符设置颜色
查看>>
安全狗2周年庆 5波活动 大奖等你来拿
查看>>
HDFS原理分析(一)—— 基本概念
查看>>
网络类库 CPPSockets
查看>>