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...

4 ответа

Мне удалось обойти это, установив ConnectTimeout на клиенте при подключении к Redis. Здесь был мой код

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

Кажется, это довольно распространенная проблема: https://github.com/StackExchange/StackExchange.Redis/issues/42

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

Я мог бы решить вышеупомянутое, сделав это:

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

Источник: /questions/35698556/ne-udalos-podklyuchitsya-k-serveru-am-redis-sozdat-otklyuchennyij-multipleksor/35698568#35698568

Так что мой init() выглядел так

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

        seClient = ConnectionMultiplexer.Connect(co);

Спасибо

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

Другие вопросы по тегам