예제 #1
0
        public Server Choose(ILoadBalancer loadBalancer)
        {
            var count = 0;

            while (count++ < 10)
            {
                var servers      = loadBalancer.ReachableServers();
                var serversCount = servers?.Count ?? 0;
                if (serversCount == 0)
                {
                    return(null);
                }
                var server = servers[GetModulo(serversCount)];
                if (server == null)
                {
                    Thread.Sleep(5 * 1000);
                    continue;
                }
                if (server.IsAlive && server.ReadyToServe)
                {
                    return(server);
                }
            }
            return(null);
        }
예제 #2
0
        public Server Choose(ILoadBalancer loadBalancer)
        {
            Server server = null;

            while (true)
            {
                var currentWeights = _accumulater.AccumulatedWeights;
                var servers        = loadBalancer.ReachableServers();
                var serversCount   = servers?.Count ?? 0;
                if (serversCount == 0)
                {
                    return(null);
                }
                var length         = currentWeights?.Length ?? 0;
                var maxTotalWeight = length == 0 ? 0 : currentWeights[length - 1];
                if (maxTotalWeight < 0.001)
                {
                    server = RibonRule.Choose(loadBalancer);
                    if (server != null)
                    {
                        return(server);
                    }
                }
                else
                {
                    var randomWeight = Random.NextDouble() * maxTotalWeight;
                    for (var i = 0; i < length; i++)
                    {
                        var weight = currentWeights[i];
                        if (!(weight > randomWeight))
                        {
                            continue;
                        }
                        server = servers[i];
                        break;
                    }
                }
                if (server == null)
                {
                    Thread.Sleep(5 * 1000);
                    continue;
                }
                if (server.IsAlive)
                {
                    return(server);
                }
                server = null;
            }
        }
예제 #3
0
 public Server Choose(ILoadBalancer loadBalancer)
 {
     while (true)
     {
         var servers      = loadBalancer.ReachableServers();
         var serversCount = servers?.Count ?? 0;
         if (serversCount == 0)
         {
             return(null);
         }
         var server = servers[Random.Next(0, serversCount)];
         if (server == null)
         {
             Thread.Sleep(5 * 1000);
             continue;
         }
         if (server.IsAlive && server.ReadyToServe)
         {
             return(server);
         }
     }
 }
예제 #4
0
 public Server Choose(ILoadBalancer loadBalancer)
 {
     while (true)
     {
         if (_collector == null)
         {
             return(RibonRule.Choose(loadBalancer));
         }
         var    minimalActiveRequestsCount = long.MaxValue;
         var    now     = DateTime.Now;
         Server chosen  = null;
         var    servers = loadBalancer.ReachableServers();
         if (servers == null)
         {
             Thread.Sleep(5 * 1000);
             continue;
         }
         var statuses = (from s in servers let status = _collector.ServerStatus(s) where !status.IsCircuitBreakerTripped(now) select status).ToArray();
         foreach (var status in statuses)
         {
             var activeRequestsCount = status.ActiveRequestsCount;
             if (activeRequestsCount > minimalActiveRequestsCount)
             {
                 continue;
             }
             minimalActiveRequestsCount = activeRequestsCount;
         }
         if (minimalActiveRequestsCount == long.MaxValue)
         {
             return(null);
         }
         var count = statuses.Count(x => x.ActiveRequestsCount == minimalActiveRequestsCount);
         chosen = count > 1 ? statuses[Random.Next(0, statuses.Length)].Server : statuses[0].Server;
         return(chosen);
     }
 }