public EndpointInfo Balance(IReadOnlyList <EndpointInfo> availableEndpoints, BackendConfig.BackendLoadBalancingOptions loadBalancingOptions) { var matching = _selector(availableEndpoints); return(ThreadLocalRandom.Current.Next(0, 101) <= _variation ? _backingLoadBalancingStrategy.Balance(matching.ToList().AsReadOnly(), loadBalancingOptions) : _backingLoadBalancingStrategy.Balance(availableEndpoints.Except(matching).ToList().AsReadOnly(), loadBalancingOptions)); }
public EndpointInfo Balance(IReadOnlyList <EndpointInfo> availableEndpoints, BackendConfig.BackendLoadBalancingOptions loadBalancingOptions) { var exceptPreferred = availableEndpoints .Except(Enumerable.Repeat(_preferredEndpoint, 1)) .ToList(); return(_isAvailable(_preferredEndpoint) ? _preferredEndpoint : _fallBackLoadBalancingStrategy.Balance(exceptPreferred.ToList().AsReadOnly(), loadBalancingOptions)); }