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 автоматически переподключался в фоновом режиме, если произойдет перехват сети.
Так что мой init() выглядел так
ConfigurationOptions co = new ConfigurationOptions()
{
SyncTimeout = 500000,
EndPoints =
{
{url,portNumber }
},
AbortOnConnectFail = false // this prevents that error
};
seClient = ConnectionMultiplexer.Connect(co);
Спасибо
Для меня эта ошибка была из-за того, что общее количество соединений достигло своего максимального предела, т.е. 10K. Перезапуск Клиента и уничтожение некоторых из них решило проблему. Вы можете проверить портал Azure и выяснить, достиг ли вы максимального лимита для какого-либо из ресурсов.