Подтвердить что ты не робот

StackExchange.Redis ConnectionMultiplexer.Connect() Временно работает

Я использую StackExchange.Redis, чтобы поговорить с 3 разными экземплярами Redis: 1 в той же подсети и 2 удаленно. Вот мой код конфигурации:

var configurationOptions = new ConfigurationOptions
{
    EndPoints =
    {
        { host, port }
    },
    KeepAlive = 180,
    Password = password,
    DefaultVersion = new Version("2.8.5"),
    // Needed for cache clear
    AllowAdmin = true
};

var connectionMultiplexer = ConnectionMultiplexer.Connect(configurationOptions );

последняя строка вызывает исключение соединения примерно 70% времени:

Не удалось подключиться к серверам redis; для создания отключенного мультиплексора отключите AbortOnConnectFail

Почему это прерывистое и/или что я делаю неправильно? Когда я пингу сервера Redis в командной строке, есть 0% потери пакетов и ответ < 1 мс. Сеть стабильна.

Спасибо!

ИЗМЕНИТЬ

Вот что выдает журнал, когда он терпит неудачу:

10.48.68.28:6379,keepAlive=180,version=2.8.5

1 unique nodes specified
Requesting tie-break from 10.48.68.28:6379 > __Booksleeve_TieBreak...
Allowing endpoints 00:00:01 to respond...
10.48.68.28:6379 did not respond
10.48.68.28:6379 failed to nominate (WaitingForActivation)
No masters detected
10.48.68.28:6379: Standalone v2.8.5, master; keep-alive: 00:03:00; int: Connecting; sub: ConnectedEstablished, 1 active; not in use: DidNotRespond
10.48.68.28:6379: int ops=0, qu=4, qs=0, qc=0, wr=0, socks=1; sub ops=2, qu=0, qs=0, qc=0, wr=0, subs=1, sync=2, socks=1
Circular op-count snapshot; int: 0 (0.00 ops/s; spans 10s); sub: 0+2=2 (0.20 ops/s; spans 10s)
Sync timeouts: 0; fire and forget: 0; last heartbeat: -1s ago
Starting heartbeat...
4b9b3361

Ответ 1

Это, по-видимому, несколько распространенная проблема: https://github.com/StackExchange/StackExchange.Redis/issues/42

Я только что загрузил новую сборку и больше не видел проблему. Тем не менее.

Ответ 2

Я смог обходить его, установив ConnectTimeouton клиента при подключении к Redis. Вот мой код

 ConnectionMultiplexer connection = 
        ConnectionMultiplexer.Connect("endpoint,password=password,ConnectTimeout=10000");

Ответ 3

Для меня эта ошибка была связана с тем, что общее количество соединений достигло своего максимального предела, то есть 10K. Перезапуск клиента и уничтожение некоторых из них решило проблему. Вы можете проверить портал Azure и выяснить, достигли ли вы максимального предела для любого из ресурсов.

Ответ 4

Я мог бы решить вышеизложенное, сделав следующее:

Ошибка, которую вы получаете, обычно является признаком того, что вы не установили abortConnect = false в строку подключения. Значение по умолчанию для abortConnect равно true, что делает его так, что StackExchange.Redis не будет автоматически подключаться к серверу при определенных условиях. Мы настоятельно рекомендуем вам установить abortConnect = false в вашей строке подключения, чтобы SE.Redis автоматически повторно подключался в фоновом режиме, если происходит сбой сети.

Источник: fooobar.com/info/415856/...

Итак, мой init() выглядел так:

 ConfigurationOptions co = new ConfigurationOptions()
        {
            SyncTimeout = 500000,
            EndPoints =
            {
                {url,portNumber }
            },
            AbortOnConnectFail = false // this prevents that error
        };

        seClient = ConnectionMultiplexer.Connect(co);

спасибо