Ошибки подключения Redis при использовании клиента Redis Booksleeve в виртуальной машине Azure
Недавно я начал размещать свой сторонний проект на новых виртуальных машинах Azure. Приложение использует Redis в качестве кеша в памяти. В моем локальном окружении все работало нормально, но теперь, когда я переместил код в Azure, я вижу странные исключения, возникающие в Книжном рукаве.
Когда приложение запускается, все работает нормально. Однако после 5-10 минут бездействия следующий запрос к приложению вызывает сетевое исключение (я сейчас на работе и у меня нет точных сообщений об ошибках, поэтому я опубликую их, когда вернусь домой, если люди думают, что они имеют отношение к обсуждению) Это приводит к закрытию внутренней MessageQueue, что приводит к тому, что каждый последующий вызов Enqueue() вызывает исключение ("Очередь закрыта").
Итак, после некоторого поиска в Google я нашел этот пост: Поддержание открытого соединения Redis с помощью BookSleeve о менеджере соединений DIY. Я, конечно, могу реализовать нечто подобное, если это лучший курс действий.
Итак, вопросы:
- Это нормально для RedisConnection периодически закрываться через определенное время?
- Я видел
conn.SetKeepAlive()
метод, но я пробовал много разных значений, и ни одно из них не имеет значения. Есть что-то еще или я лаю не на том дереве? - Является ли идея менеджера соединений из поста выше лучшим способом справиться с этим сценарием?
- Может кто-нибудь пролить дополнительный свет на то, почему размещение моего экземпляра Redis на новой виртуальной машине Azure вызывает эту проблему? Я также могу подтвердить, что, если я запускаю свою локальную среду на виртуальной машине Azure Redis, у меня возникает эта проблема.
Как я уже сказал, если соединение Redis будет необычным, если он неактивен, я опубликую следы стека и исключения из моих журналов, когда вернусь домой.
Спасибо!
ОБНОВЛЕНИЕ Дидье указал в комментариях, что это может быть связано с балансировщиком нагрузки, который использует Azure: http://blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-timeout-details.aspx
Предполагая, что это так, что было бы лучшим способом реализовать диспетчер соединений, который мог бы объяснить эту глупую проблему. Я предполагаю, что я не должен создавать соединение на единицу работы, верно?
2 ответа
Из других ответов / комментариев кажется, что это вызвано тем, что инфраструктура Azure закрывает сокеты, которые выглядят бездействующими. Вы могли бы просто иметь где-то таймер, который периодически выполняет какую-то операцию, но учтите, что она уже встроена в Booksleeve: когда он подключается, он проверяет время ожидания подключения redis и настраивает биение, чтобы предотвратить закрытие сокета redis. Возможно, вам удастся сделать это, чтобы лазурь не закрыла сокет. Например, в сеансе redis-cli:
config set timeout 30
следует настроить Redis (на лету, без необходимости перезапуска) на время ожидания соединения 30 секунд. Книжная гильза должна автоматически принять меры, чтобы убедиться, что сердцебиение произошло незадолго до 30 секунд. Обратите внимание, что в случае успеха вам также следует отредактировать файл конфигурации, чтобы этот параметр применялся и после следующего перезапуска.
Балансировщик нагрузки в Windows Azure закроет соединение после того, как количество времени X будет зависеть от общей нагрузки соединения на балансировщик нагрузки, и из-за этого вы получите случайное время ожидания в вашем соединении.
Поскольку я не очень хорошо знаком с подключениями Redis, я не могу предложить, как правильно его реализовать, однако, в общем, предложенный обходной путь - это пульс, чтобы поддержать ваш сеанс. Есть ли у вас шанс найти решение, предложенное в блоге, и попытаться внедрить его в Redis, если это сработает для вас?