首页 > 其他分享 >负载均衡策略之随机策略

负载均衡策略之随机策略

时间:2022-10-22 17:33:25浏览次数:50  
标签:选取 index 负载 服务 策略 server 随机 return null

随机策略:在可用服务中,随机找一个,如果随机找到的server为null或者不可用,就会while不停的循环选取,直到选取可用的server

源码分析:

public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            return null;
        } else {
            Server server = null;
            
            while(server == null) {
                if (Thread.interrupted()) {
                    return null;
                }
                
                // 获取可用服务集合
                List<Server> upList = lb.getReachableServers();
                // 获取所有服务集合
                List<Server> allList = lb.getAllServers();
                // 所有服务数
                int serverCount = allList.size();
                // 如果没有服务,那么直接返回null
                if (serverCount == 0) {
                    return null;
                }
                // 随机选取一个下标
                int index = this.chooseRandomInt(serverCount);
                // 根据下标在可用服务集合中选取一个服务
                server = (Server)upList.get(index);
                // 如果该服务为空,那么就重新选取
                if (server == null) {
                    Thread.yield();
                } else {
                    // 如果该服务是存活的,那么直接返回,否则重新选取
                    if (server.isAlive()) {
                        return server;
                    }
                    // 重新选取
                    server = null;
                    Thread.yield();
                }
            }
            
            return server;
        }
    }

在读取源码时,遇到的两个疑问:

疑问1:

在选取服务时,生成随机索引,为什么不直接拿可用服务总数生成随机数index,而是拿总服务数生成随机数index,再用这个index下标在可用服务集合中拿去服务。

疑问2:

该疑问是在1的基础上衍生出的,可用服务总数小于总服务数时,拿总服务数生成随机数index可能大于可用服务总数,这时使用get方法会报错,但是在源码这块没有进行抛出异常处理。

有大佬能否解答一下!感谢!

标签:选取,index,负载,服务,策略,server,随机,return,null
From: https://www.cnblogs.com/du001011/p/16816750.html

相关文章

  • 102-nginx配置集群,负载均衡
    vinginx.conf在#gzipon;之后添加:upstreamorg.tonny.balance{server127.0.0.1:8081weight=1;se......
  • Golang 和 Python 随机生成N位字符串
    Golang:funcRandomString(nint)string{ varletters=[]byte("ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789") result:=make([]byte,n) /......
  • 第二十三章 CSP Session 管理 - 身份验证共享策略
    第二十三章CSPSession管理-身份验证共享策略本节介绍如何通过两种方式创建一组应用程序以作为一个组工作:共享认证:如果应用程序不共享认证,用户必须分别登录到被另一......
  • R语言用多元ARMA,GARCH ,EWMA, ETS,随机波动率SV模型对金融时间序列数据建模|附代码数
    全文下载链接:http://tecdat.cn/?p=20015本文将说明单变量和多变量金融时间序列的不同模型,特别是条件均值和条件协方差矩阵、波动率的模型。均值模型本节探讨条件均值模......
  • C++三角形区域随机行走
    #include<stdio.h>#include<stdlib.h>#include<vector>#include<time.h>#include<algorithm>#include<iostream>usingnamespacestd;vector<vector<int>>a(4);int......
  • Pygame实战(一):随机抽位置
    目录Pygame实战(一):随机抽位置一、概述1、简介2、设计思路3、成果展示二、开始编程1、配置文件2、程序界面2.1读取配置2.2工具类2.3显示区2.4操作区2.5随机矩形3......
  • P3830 [SHOI2012]随机树
    [SHOI2012]随机树题目背景SHOI2012D1T3题目描述输入格式输入仅有一行,包含两个正整数q,n,分别表示问题编号以及叶结点的个数。输出格式输出仅有一行,包含一个实数......
  • 如何强制swarm集群中的service进行负载再均衡?
    这个题目是不是很奇怪,没错!所谓的负载再平衡,指的是:当集群新加入某个节点,或者某个节点由于异常离开集群,之后又加回到集群的情况。 很显然,这些新的节点上是不会有负载的,也......
  • 一个简单的 JS 抽取随机数源代码
    一个简单的JS抽取随机数源代码自己写了一个JS抽取随机数的例子。供自己以后参考,也希望可以方便到大家。源代码如下:<html><head><metahttp-equ......
  • 分支策略
    Gitlab分支策略建议指南  本文分支策略为总结各中小型企业常见做法(仅代表个人观点),在下才疏学浅,文章如有缺漏或不当之处,望各位帮忙指正。写此文也十分希望能起抛砖......