Тайм-аут клиента Redis для стека Exchange - PullRequest
0 голосов
/ 23 марта 2020

Я изо всех сил пытаюсь понять, что говорит мне это сообщение об ошибке от клиента Redis Stack Exchange:

Необработанное исключение: System.AggregateException: произошла одна или несколько ошибок. (Тайм-аут в ожидании ответа (исходящий = 0 КБ, входящий = 0 КБ, 32516 мс прошло, время ожидания составляет 30000 мс), инстанс: 0, кв: 0, qs: 1, в: 0, серверEndpoint: не указан / XXX: 6379, мг: 9 из 10 доступно, clientName: YYY, IOCP: (Занято = 0, Свободно = 1000, Мин = 2, Макс = 1000), РАБОЧИЙ: (Занято = 1025, Свободно = 31742, Мин = 1024, Макс = 32767), v: 2.0. 571.20511 (Пожалуйста, посмотрите в этой статье некоторые распространенные проблемы на стороне клиента, которые могут вызвать тайм-ауты: https://stackexchange.github.io/StackExchange.Redis/Timeouts)) ---> StackExchange.Redis.RedisTimeoutException: время ожидания ответа (outbound = 0KiB, входящий = 0 КБ, 32516 мс прошло, время ожидания составляет 30000 мс), инстанс: 0, кв: 0, кв: 1, в: 0, точка сервера: не указана / XXX: 6379, мгр: 9 из 10 доступны, clientName: YYY, IOCP: ( Занят = 0, Свободен = 1000, Мин = 2, Макс = 1000), РАБОЧИЙ: (Занят = 1025, Свободен = 31742, Мин = 1024, Макс = 32767), v: 2.0.571.20511 (Пожалуйста, ознакомьтесь с этой статьей для некоторых распространенных проблем на стороне клиента, которые могут вызвать тайм-ауты: https://stackexchange.github.io/StackExchange.Redis/Timeouts

Я использую этот код для выбора наименее загруженного мультиплексора соединения и ba Выключите, но я все еще получаю тайм-ауты при запуске большого количества команд набора строк.

public class RedisConnectionManager : IRedisConnectionManager
{
    private const int MaxQueueLength = 10;
    private readonly List<Lazy<ConnectionMultiplexer>> _connectionMultiplexers;

    public RedisConnectionManager(List<Lazy<ConnectionMultiplexer>> connectionMultiplexers)
    {
        this._connectionMultiplexers = connectionMultiplexers;
    }

    public async Task<ConnectionMultiplexer> GetLeastBusyConnectionAsync()
    {
        var leastBusyConnection = this._connectionMultiplexers.OrderBy(connection => connection.Value.GetCounters().Interactive.TotalOutstanding).First();
        await WaitUntilConnectionAvailableAsync(leastBusyConnection);
        return this._connectionMultiplexers.OrderBy(connection => connection.Value.GetCounters().Interactive.TotalOutstanding).First().Value;
    }

    private static async Task WaitUntilConnectionAvailableAsync(Lazy<ConnectionMultiplexer> leastBusyConnection)
    {
        while (leastBusyConnection.Value.GetCounters().Interactive.TotalOutstanding > MaxQueueLength)
        {
            await Task.Delay(100);
        }
    }
}
...