C#实现Nginx平滑加权轮询算法

本文实例为大家分享了C#实现Nginx平滑加权轮询算法的具体代码,供大家参考,具体内容如下

代码很简单,算法很经典!

1. 定义实体类

public struct ServerConfig
 {
  //初始权重
  public int Weight {get;set;}

  //当前权重
  public int Current {get;set;}

  //服务名称
  public string Name {get;set;}
 }

2. 算法

public static int NextServerIndex(ServerConfig[] serverConfigArray)
 {
  int index = -1;
  int total = 0;
  int size = serverConfigArray.Count();
  for(int i = 0; i< size; i++)
  {
   serverConfigArray[i].Current += serverConfigArray[i].Weight;
   total += serverConfigArray[i].Weight;
   if (index == -1 || serverConfigArray[index].Current < serverConfigArray[i].Current)
   {
    index = i;
   }
  }
  serverConfigArray[index].Current -= total;
  return index;
 }

3.调用

static void Main(string[] args)
  {
    var sv = new ServerConfig[] {
      new ServerConfig{Name="A", Weight = 4},
      new ServerConfig{Name="B", Weight = 2},
      new ServerConfig{Name="C", Weight = 1}
    };
    int index = 0;
    int sum = sv.Sum(m => m.Weight);
    for(int i=0; i<sum; i++)
    {
      index = NextServerIndex(sv);
      Console.WriteLine("{0}{1}", sv[index].Name, sv[index].Weight);
    }
    Console.Read();
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • c# 实现轮询算法实例代码

    c# 轮询算法 这两天做东西,业务上有个特殊的需求,在用户访问页面的时候,针对某一行代码进行控制,按照概率来进行显示,我做的是针对当前页面的曝光进行处理,曝光代码是第三方的,页面上只要有这段代码就算是执行了这段曝光代码,所以才写了这个轮询的一个方法,这个方法可以根据自己的需求修改,下面我把这个方法全部帖出来: CacheSlidingExpirationHour:时间,缓存时间2小时 CountdownCurrentIndexCacheName:缓存名称 log:日志 m_objCountdow

  • C#实现Nginx平滑加权轮询算法

    本文实例为大家分享了C#实现Nginx平滑加权轮询算法的具体代码,供大家参考,具体内容如下 代码很简单,算法很经典! 1. 定义实体类 public struct ServerConfig { //初始权重 public int Weight {get;set;} //当前权重 public int Current {get;set;} //服务名称 public string Name {get;set;} } 2. 算法 public static int NextServerIndex(S

  • Java实现平滑加权轮询算法之降权和提权详解

    目录 前言 1.两个关键点 2.代码实现 2.1.服务节点类 2.2.平滑轮询算法降权和提权 3.分析结果 4.结论 前言 上一篇讲了普通轮询.加权轮询的两种实现方式,重点讲了平滑加权轮询算法,并在文末留下了悬念:节点出现分配失败时降低有效权重值:成功时提高有效权重值(但不能大于weight值). 本文在平滑加权轮询算法的基础上讲,还没弄懂的可以看上一篇文章. 现在来模拟实现:平滑加权轮询算法的降权和提权 1.两个关键点 节点宕机时,降低有效权重值: 节点正常时,提高有效权重值(但不能大于wei

  • Go 实现 Nginx 加权轮询算法的方法步骤

    目录 一,Nginx 负载均衡的轮询 (round-robin) 1. nginx 中的配置 2. 简单介绍 3. 特点 4. 实现 (这里使用golang模拟实现) 5. 测试 二,Nginx 负载均衡的加权轮询 (weighted-round-robin) 1. nginx 配置 2. 加权算法简介-特点 3. 算法说明 4. 简单举例 5. 代码实现 6. 测试验证 最近在看一些 getway 相关的资料,发现有关 Nginx 负载均衡的算法有点多,但是有点乱,所以整理下...如有不对地方

  • 详解Nginx轮询算法底层实现的方法

    轮询算法简介 在工作中很多人都使用到了nginx,对nginx得配置也是烂熟于心,今天我主要想介绍一下nginx轮询算法得几种底层实现方式. 简单轮询算法 这种算法比较简单,举个例子就是你有三台服务器 第一台服务器 192.168.1.1 第二台服务器 192.168.1.2 第三台服务器 192.168.1.3 第一个请求过来之后默认访问第一台,第二个请求过来访问第二台,第三次请求过来访问第三台,第四次请求过来访问第一台,以此类推.以下是我代码实现简单得算法: public class Sim

  • Java负载均衡算法实现之轮询和加权轮询

    目录 1.普通轮询算法 2.加权轮询算法 2.1.实现方式一 2.2.实现方式二(重点难点) 2.2.1.概述 2.2.2.举个例子理解算法 2.2.3.代码实现 总结 1.普通轮询算法 轮询(Round Robin,RR)是依次将用户的访问请求,按循环顺序分配到web服务节点上,从1开始到最后一台服务器节点结束,然后再开始新一轮的循环.这种算法简单,但是没有考虑到每台节点服务器的具体性能,请求分发往往不均衡. 代码实现: /** * 普通轮询算法 */public class RoundRob

  • nginx 负载均衡轮询方式配置详解

    一.概述 Nginx的upstream目前支持的分配算法:1.round-robin 轮询1:1轮流处理请求(默认)每个请求按时间顺序逐一分配到不同的应用服务器,如果应用服务器down掉,自动剔除,剩下的继续轮询.2.weight 权重(加权轮询)通过配置权重,指定轮询几率,权重和访问比率成正比,用于应用服务器性能不均的情况.3.ip_hash 哈希算法每个请求按访问ip的hash结果分配,这样每个访客固定访问一个应用服务器,可以解决session共享的问题.应用服务器如果故障需要手工down掉

  • PHP实现负载均衡的加权轮询方法分析

    本文实例讲述了PHP实现负载均衡的加权轮询方法.分享给大家供大家参考,具体如下: 1. 负载均衡算法有哪些? 轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载. 随机法:通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问. 源地址哈希法:根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号.采用源地址哈希法进行负载

  • Golang加权轮询负载均衡的实现

    目录 实现加权轮询负载均衡思路 加权轮询负载均衡代码 测试代码 实现加权轮询负载均衡思路 代码实现一个加权负载均衡 Weight            初始化时对节点约定的权重 currentWeight     节点临时权重,每轮都会变化 effectiveWeight   节点有效权重,默认与Weight相同 totalWeight       所有节点有效权重之和:sum(effectiveWeight) 代码实现一个加权负载均衡 currentWeight = currentWeight

  • 关于SpringCloud Ribbon替换轮询算法问题

    Spring Cloud Ribbon是基于Netlix Ribbon实现的一套客户端负载均衡的工具. 简单的说,Ribbon是Netflix发布的开源项. Ribbon负载均衡调用 概述 Spring Cloud Ribbon是基于Netlix Ribbon实现的一套客户端负载均衡的工具.简单的说,Ribbon是Netflix发布的开源项目, 主要功能是提供客户端的软件负载均衡算法和服务调用.Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等.简单的说,就是在配置文件中列出Load

随机推荐