Служебный стек Redis восстанавливает соединение после перезагрузки сервера Redis
Мы используем BlockingDequeue стека RedisClient из Service Stack, чтобы сохранить некоторые данные до тех пор, пока они не будут обработаны. Код вызова выглядит так
using (var client = ClientPool.GetClient())
return client.As<TMessage>().Lists[_channel].BlockingDequeue(timeout);
Если сервер, на котором размещается Redis, перезапускается, соединения для BlockingDequeue становятся зомби и никогда не возвращаются, пока клиентское приложение не будет перезапущено.
Мы попытались установить тайм-аут для BlockingDequeue, а также PooledConnectionManager, но ни один из них не помог, я предполагаю, потому что тайм-аут применяется на стороне сервера.
Этот тип отказоустойчивости встроен в служебный стек, и нам его не хватает?
Или это то, что наша реализация должна обрабатывать? Если да, есть ли рекомендуемые подходы?
1 ответ
Мы столкнулись с той же проблемой в нашем коде подписки ServiceStack.Redis, мы попробовали несколько параметров, таких как retrycount, retrytimeout и т. Д., Ни один из них не работает, позже наш обходной путь должен перехватить RedisException и снова выполнить подписку.