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); }
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; } }
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); } } }
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); } }