2012-03-20 19 views
6

クライアントがRedisに文書が存在するかどうかを確認し、そうでない場合はデータベースからデータを取得するパターンを実装しています。ServiceStack Redis Clientをタイムアウトで実装する方法

Redisサーバーがダウンしているか、または到達不能な状況に対処しようとしているため、すぐにデータベースからフェッチできます。

ただし、意図的にRedisサーバーを停止してコードをテストすると、ServiceStackクライアントを介したRedisの呼び出しは約20秒間タイムアウトしません。

RedisClient .SendTimeoutプロパティをさまざまな値(1000,100,1)に設定しようとしましたが、タイムアウトは常に約20秒後に発生します。また、.Ping()メソッドを使用しようとしましたが、同じ問題があります。

質問:Redisサーバーがダウンしていて、DBフェッチにすばやく切り替える場合は、どのように対処できますか?

答えて

0

プランBにフリップする前にリクエストが待機する時間を通知するために、redisサーバーに依存しないでください。このロジックを、要求を実行するコードに入れて、redisサーバーの設定方法に依存しないようにしてください。

1

私は電子メールを送信するのに似た問題がありました。答えがなく、(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)); 

たぶん似た何かがちょうどRedisののことを行い方法でのsendEmailを交換する、あなたのために働くだろう:

私のソリューションは、タスクに呼び出しをラップし、その上でタイムアウトを使用することでした。

関連する問題