当前位置: 首页 > news >正文

负载均衡之最小活跃数算法

文章目录

    • @[toc]
      • 一、概念
      • 二、场景与设计思路
      • 三、实现
      • 四、代码下载

一、概念


  • 活跃数
    • 集群中各实例未处理的请求数。
  • 最小活跃数
    • 集群中各个实例,哪个实例未处理的请求数据最小,就称之为最小活跃数。

二、场景与设计思路


  • 场景
    • 以获取微服务地址为场景。
  • 设计思路
    • 初始化微服务地址,并初始化活跃数。
    • 获取字典或集合中活跃数最小的值,如果获取的值有多个,说明活跃数是相同,必须随机出一个地址后,活跃数并且加1。
    • 获取到地址后,必须将该地址的活跃数减1。

三、实现


  • 新建抽象类–AbstractLeastActive
     public abstract class AbstractLeastActive{#region  变量 /// <summary>/// 字典/// </summary>public ConcurrentDictionary<string, int> keyValuePairs = new ConcurrentDictionary<string, int>();/// <summary>/// 相同编号的数据集合 /// </summary>protected List<string> list = new List<string>();#endregion  #region 虚函数/// <summary>/// 筛选最小编号的数据/// </summary>protected void FilterMinValue(){int number = int.MaxValue;foreach (var item in keyValuePairs){if (number >= item.Value){if (number == item.Value){number = item.Value;list.Add(item.Key);continue;}list.Clear();number = item.Value;list.Add(item.Key);}}}/// <summary>/// 随机集合中的数据/// </summary>protected string RandomValue(){Random random = new Random();var num = random.Next(list.Count);return list[num];}/// <summary>/// 活跃数加1/// </summary>/// <param name="key">key值</param>protected void AddActive(string key) {keyValuePairs.TryUpdate(key, keyValuePairs[key]+1, keyValuePairs[key]);}#endregion/// <summary>/// 释放编号/// </summary>/// <param name="key"></param>public abstract void Dispose(string key);/// <summary>/// 获取最小活跃数/// </summary>/// <returns></returns>public abstract string GetValue();
    
  • 新建实现类–LeastActive
      public class LeastActive : AbstractLeastActive{/// <summary>/// 获取最小活跃数据/// </summary>/// <returns></returns>public override string GetValue(){string value = "";//筛选数据this.FilterMinValue();if (this.list.Count == 1){value = this.list[0];//活跃数加1this.AddActive(value);return value;}else if (this.list.Count > 1) {value = this.RandomValue();//活跃数加1this.AddActive(value);return value;}return value;}/// <summary>/// 最小活跃数据释放 /// </summary>/// <param name="key"></param>public override void Dispose(string key){keyValuePairs.TryUpdate(key, keyValuePairs[key] - 1, keyValuePairs[key]);}}
    
  • 新建单元测试
          private AbstractLeastActive abstractLeastActive = new LeastActive();[Fact]public void Test1(){abstractLeastActive.keyValuePairs.TryAdd("http://localhost:8080", 0); abstractLeastActive.keyValuePairs.TryAdd("http://localhost:8082", 1);abstractLeastActive.keyValuePairs.TryAdd("http://localhost:8081", -1);abstractLeastActive.keyValuePairs.TryAdd("http://localhost:8083", -1);string value = abstractLeastActive.GetValue();abstractLeastActive.Dispose(value);Assert.Equal("http://localhost:8083", value);}
    

四、代码下载

CSDN:https://download.csdn.net/download/Fu_Shi_rong/87435602
Git:https://gitee.com/Fu_Shi_rong/gcnf.algorithm

http://www.lryc.cn/news/2227.html

相关文章:

  • JavaScript 评测代码运行速度的几种方法
  • Linux 编译器 gcc/g++
  • 2.Java基础【Java面试第三季】
  • Java高级-多线程
  • mysql高级(事务、存储引擎、索引、锁、sql优化、MVCC)
  • Java后端开发功能模块思路
  • CAPL(vTESTStudio) - DoIP - TCP发送_05
  • 使用IntelliJ IDEA搭建datax-web开发环境
  • [SSD固态硬盘技术 14] GC垃圾回收太重要了
  • lamada表达式、stream、collect整理
  • Nacos 入门微服务项目实战
  • 【c++】类和对象:让你明白“面向一个对象有多重要”:构造函数,析构函数,拷贝构造函数的深入学习
  • 职场IT老手教你3步教你玩转可视化大屏设计,让领导眼前一亮!
  • 【光伏功率预测】基于EMD-PCA-LSTM的光伏功率预测模型(Matlab代码实现)
  • 大数据Kylin(二):Kylin安装使用
  • 我们的微服务中为什么需要网关?
  • 互联网医院源码 线上问诊 智慧医院源码 C#源码
  • 基于昇腾计算语言AscendCL开发AI推理应用
  • JS document.write()换行
  • Java高级-集合-Collection部分
  • Android性能优化:getResources()与Binder交火导致的界面卡顿优化
  • 常见的内存操作函数
  • python关键字
  • C语言 | 预处理知识详解 #预处理指令有哪些?他们如何使用?宏和函数有哪些区别?...#
  • 如何实现LFU缓存(最近最少频率使用)
  • 【C++之容器篇】精华:vector常见函数的接口的熟悉与使用
  • InstructGPT
  • RTOS之一环境搭建(基于TM4C123GXL)
  • 151、【动态规划】AcWing ——2. 01背包问题:二维数组+一维数组(C++版本)
  • DS期末复习卷(二)