Вопрос по redis, c#, booksleeve, azure – Ошибки подключения Redis при использовании клиента Redis Booksleeve в виртуальной машине Azure

6

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

Когда приложение запускается, все работает нормально. Однако примерно через 5-10 минут бездействия следующий запрос к приложению вызывает сетевое исключение (я сейчас на работе и у меня нет точных сообщений об ошибках, поэтому я буду публиковать их, когда вернусь домой, если люди думают, что они «уместны для обсуждения». Это приводит к закрытию внутреннего MessageQueue, что приводит к тому, что каждый последующий Enqueue () вызывает исключение («Очередь закрыта»).

Так что после некоторого поиска в Google я нашел этот пост:Поддержание открытого соединения Redis с помощью BookSleeve о менеджере соединений DIY. Я, конечно, могу реализовать нечто подобное, если это лучший способ действий.

Итак, вопросы:

Is it normal for the RedisConnection to close periodically after a certain amount of time? I've seen the conn.SetKeepAlive() method but I've tried many different values and none seem to make a difference. Is there more to this or am I barking up the wrong tree? Is the connection manager idea from the post above the best way to handle this scenario? Can anyone shed any additional light on why hosting my Redis instance in a new Azure VM causes this issue? I can also confirm that if I run my local environement against the Azure Redis VM I experience this issue.

Как я уже сказал, если соединение Redis будет необычным для соединения после бездействия, я опубликую трассировку стека и исключения из моих журналов, когда вернусь домой.

Спасибо!

UPDATE В комментариях Дидье указал, что это может быть связано с балансировщиком нагрузки, который использует Azure:http://blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-timeout-details.aspx

Предполагая, что это так, что было бы лучшим способом реализовать диспетчер соединений, который мог бы объяснить эту глупую проблему. Я предполагаю, что не должен создавать соединение на единицу работы, верно?

Тайм-аут уже установлен на 0. Просто дважды проверил это. :( Eric
@ Эрик из любопытства - настроен ли тайм-аут соединения на вашем сервере redis? Если это так, BookSleeve должен автоматически настроить себя с помощью пульса ... Может быть, это остановит балансировщик нагрузки от его уничтожения? Marc Gravell♦
Кажется, это «особенность» AzureVM ... Посмотретьblogs.msdn.com/b/avkashchauhan/archive/2011/11/12/… Didier Spezia
Что у вас есть в параметре timeout файла конфигурации Redis? Это время простоя (установите 0, чтобы Redis не закрывал незанятые соединения). Didier Spezia
@Eric 3600 - это час ... есть идеи, каково время лазурного убийства? Я бы сказал, «короче, чем это». Обратите внимание, что это просто для того, чтобы проверить, будет ли сердцебиение книжного рукава поддерживать TCP в активном состоянии - если он работает, мы, вероятно, сможем заставить его работать без необходимости изменять конфигурацию. Небольшое примечание: вам не нужно перезапускать Redis, чтобы изменить время ожидания соединения - вы наверняка можете сделать это в сеансе Redis-Cli (или аналогичном) Marc Gravell♦

Ваш Ответ

2   ответа
1

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

Поскольку я не очень хорошо знаком с подключениями Redis, я не могу предложить, как правильно его реализовать, однако, в общем, предложенный обходной путь - это пульс, чтобы поддержать ваш сеанс. У вас есть шанс найти решение, предложенное в блоге, и попытаться внедрить его в Redis, если это сработает для вас?

Спасибо Авкаш. На самом деле я собирался попробовать использовать виртуальную сеть в новом предварительном просмотре Azure, но, к сожалению, мне не разрешено создавать виртуальную машину из пользовательского образа и добавлять ее в группу Affinity. Видимо, это разрешено только с экрана быстрого создания? Я также отправил сообщение на форум виртуальной сети. Eric
Привет, Эрик, я видел твой пост и смогу помочь тебе с вопросом создания виртуальной машины, но есть некоторые проблемы с форумом MSDN, поэтому я не могу не связаться с тобой. Как только это решится, я свяжусь с вами, чтобы увидеть, что можно сделать .. спасибо ..
Я верю, что знаю, что происходит. По-видимому, созданное мной изображение доступно только в том месте, в котором оно начало свою жизнь (это был Запад США) - я создал vlan после изображения, и теперь кажется, что невозможно переместить изображение из одного места в другое. Есть ли у вас идеи, если создание vlan будет заметно лучше с точки зрения производительности? Я имею в виду, это не слишком обременительно, чтобы просто создать биение в моем приложении, если это будет необходимо. Eric
6

что это вызвано тем, что инфраструктура Azure закрывает сокеты, которые выглядят бездействующими. Выcould просто где-то есть таймер, который периодически выполняет какую-то операцию, но обратите внимание, что она уже встроена в Booksleeve: когда он подключается, он проверяет время ожидания подключения redis и настраивает биение, чтобы предотвратить закрытие сокета redis. Возможно, вам удастся зафиксировать это, чтобы лазурь не закрыла сокет. Например, в сеансе redis-cli:

config set timeout 30

следует настроить Redis (на лету, без необходимости перезапуска) на время ожидания соединения 30 секунд. Книжная гильза должна автоматически принять меры, чтобы убедиться, что сердцебиение произошло незадолго до 30 секунд. Обратите внимание, что в случае успеха вам также следует отредактировать файл конфигурации, чтобы этот параметр применялся и после следующего перезапуска.

Стоит отметить, что вам нужно установить тайм-аут & gt; 0 здесь для Booksleeve, чтобы сделать автоматические проверки Ping (), когда установлено conn.SetKeepAlive (true). Поэтому в Azure вам нужно установить тайм-аут на 30 секунд, как указано выше, а также conn.SetKeepAlive (true). Без установленного тайм-аута для конфигурации Booksleeve не будет выполнять проверки пинга (даже если keepalive = true, внутренняя проверка внутри Booksleeve пропускает эхо-запросы, когда таймаут не установлен). Это означало бы, что Azure все еще закрывает сокет из-за бездействия.
Имеет ли StackExchange.Redis такое же сердцебиение, если в конфигурации redis присутствует тайм-аут?
@slypete yes, но он также имеет пульс по умолчанию, если нет времени ожидания

Похожие вопросы