예제 #1
0
        private Uri Select(IList <Uri> addresses, RoundRobinArrayIndex roundRobinIndex, string addressType)
        {
            var count = addresses.Count;

            if (count == 0)
            {
                LogDebug($"Unable to select {addressType}, no known addresses given.");
                return(null);
            }

            var index   = roundRobinIndex.Next(count);
            var address = addresses[index];

            LogDebug($"Selected {addressType} with address: '{address}' in round-robin fashion.");
            return(address);
        }
예제 #2
0
        private Uri Select(IList <Uri> addresses, RoundRobinArrayIndex roundRobinIndex, string addressType)
        {
            var count = addresses.Count;

            if (count == 0)
            {
                _logger.Trace($"Unable to select {addressType}, no known addresses given");
                return(null);
            }

            var index   = roundRobinIndex.Next(count);
            var address = addresses[index];

            _logger.Trace($"Unable to select {addressType}, no known addresses given");
            return(address);
        }
예제 #3
0
        private Uri Select(IList <Uri> addresses, RoundRobinArrayIndex roundRobinIndex, string forDatabase,
                           string addressType)
        {
            var count = addresses.Count;

            if (count == 0)
            {
                LogDebug($"Unable to select {addressType} for database '{forDatabase}', no known addresses given");
                return(null);
            }

            // choose start index for iteration in round-robin fashion
            var startIndex = roundRobinIndex.Next(count);
            var index      = startIndex;

            Uri leastConnectedAddress  = null;
            var leastActiveConnections = Int32.MaxValue;

            // iterate over the array to find least connected address
            do
            {
                Uri address          = addresses[index];
                int inUseConnections = _connectionPool.NumberOfInUseConnections(address);

                if (inUseConnections < leastActiveConnections)
                {
                    leastConnectedAddress  = address;
                    leastActiveConnections = inUseConnections;
                }

                // loop over to the start of the array when end is reached
                if (index == count - 1)
                {
                    index = 0;
                }
                else
                {
                    index++;
                }
            } while (index != startIndex);

            LogDebug(
                $"Selected {addressType} for database '{forDatabase}' with least connected address: '{leastConnectedAddress}' and active connections: {leastActiveConnections}");

            return(leastConnectedAddress);
        }