实现一个简单的轮询算法
2023-04-18 14:45:47 时间
前言
负载均衡,大家应该听的也不少了,也实践过N次了。
当然也会知道,负载均衡是有不少算法的:随机,轮询,加权轮询,最少连接。。。。
本文重点说的是轮询。
先举个例子看看轮询算法是如何运作的。
假设我们的API站点有3台负载(10.0.10.1,10.0.10.2和10.0.10.3),客户端第一次请求API的时候,会访问.1拿到结果,第二次会访问.2拿到结果,第三次则会访问.3拿到结果,后面就是依次类推。
在致就是这个样子的访问顺序。
.1->.2->.3>.1>.2......
当然,上面的情况是太太太理想了!!只是能帮助我们理解轮询是怎么一回事!
下面是比较官方的描述:
按顺序把每个新的连接请求分配给下一个服务器,最终把所有请求平分给所有的服务器。
下面来简单看看如何实现
简单实现
我们围绕的重点如下:
- 服务器列表
- 上一次访问的是那台机器
- 下一次要访问的是那台机器
下面是实现
public class RoundRobin<T>
{
//服务器列表
private readonly IList<T> _items;
//锁
private readonly object _syncLock = new object();
//当前访问的服务器索引,开始是-1,因为没有人访问
private int _currentIndex = -1;
public RoundRobin(IEnumerable<T> 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<string>
{
"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<string>(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();
}
结果:
示例代码:
相关文章
- 谷歌真急了,推DeepMind撑场!700亿参数Sparrow硬刚ChatGTP
- 几十年数学难题被谷歌研究员意外突破!曾因不想搞数学自学编程,当年差点被导师赶出门
- 拿破仑、孔子在线陪聊!AI聊天机器人「复活」历史名人,网友:真上头!
- 剽窃、作弊,ChatGPT竟偷偷生成了12篇署名论文!Marcus炮轰Ta变成CheatGPT
- 生成式AI成硅谷风投新宠儿,1年78起融资共投入93亿,多家公司估值飙升至数十亿
- B站up主用AI分析,跨年演唱会上这些歌手假唱了
- 携程日志系统治理演进之路
- 我用ChatGPT写神经网络:一字不改,结果竟然很好用
- AI从零开始学会玩《我的世界》,DeepMind AI通用化取得突破
- 斯坦福、伯克利新研究推翻谷歌「量子霸权」!理论上很美,实际上没戏
- 微软欲向OpenAI投资100亿美元 扩大AI技术的深度应用
- 搅动100亿美金的ChatGPT,竟然这么依赖TA?
- 100万亿参数的GPT 4 刷屏AI社区,大概率是假消息
- 程序员离职删光代码注释违法吗?
- ChatGPT专业版可以排队了!限制更少但收费,网友:钱已备好
- 微软CEO:科技行业未来两年挑战重重,人工智能有望成为发展新范式
- 微软又向OpenAI狂砸100亿美元!巨头AI大棋下4年,谁是最大赢家?
- 谷歌研究员炮轰GPT初创公司瞎炒作,连发18条推文怒怼!
- ChatGPT取代搜索引擎?谷歌急了,百度不慌:早已布局
- 达摩院2023十大科技趋势发布