Как внедрить ServiceStack Redis Client с тайм-аутом - PullRequest
6 голосов
/ 21 марта 2012

Мы реализуем шаблон, в котором наш клиент проверяет, существует ли документ в Redis, а если нет, то мы получаем данные из базы данных.

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

Однако, когда мы тестируем наш код, преднамеренно отключая сервер Redis, вызов Redis через клиент ServiceStack не истекаетпримерно 20 секунд.

Мы пытались использовать свойство RedisClient .SendTimeout для различных значений (1000, 100, 1), но время ожидания всегда происходит примерно через 20 секунд.Мы также попытались использовать метод .Ping (), но у нас возникла та же проблема.

Вопрос: как нам справиться со сценарием, когда сервер Redis не работает и мы хотим быстрее переключиться на выборку из БД?

Ответы [ 2 ]

1 голос
/ 28 мая 2015

У меня была похожая проблема с отправкой электронной почты: иногда нет ответа, и время ожидания для встроенной функции (SmtpClient) ничего не делает. В конце концов я получу тайм-аут, который, как я считаю, исходит от базового уровня TCP / IP. Я бы установил тайм-аут в клиенте немного короче, чем «брутальный тайм-аут» в Task.Wait.

Мое решение заключалось в том, чтобы обернуть вызов в задачу и использовать тайм-аут для этого:

        // this special construct is to set a timeout (the SmtpClient timeout does not seem to work)
        var task = Task.Factory.StartNew(() => SendEmail(request));

        if (!task.Wait(6000))
            Log.Error("Could not send mail to {0}. Timeout (probably on TCP layer).".Fmt(request.To));

Может быть, что-то подобное будет работать для вас, просто замените SendEmail на метод, который выполняет Redis.

0 голосов
/ 11 мая 2012

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

...