在Azure VM中使用Booksleeve Redis客户端时出现Redis连接错误

Eri*_*ric 6 c# azure redis booksleeve

我最近开始在新的Azure VM上托管我的一个侧面项目.该应用程序使用Redis作为内存缓存.在我的本地环境中,一切都运行良好,但现在我已经将代码移动到Azure了,我看到一些奇怪的例外来自Booksleeve.

当应用程序首次启动时,一切正常.但是,在大约5-10分钟的不活动之后,对应用程序的下一个请求会遇到网络异常(我现在正在工作,并且没有确切的错误消息,所以当我回到家时我会发布它们人们认为它们与讨论密切相关)这导致内部MessageQueue关闭,这导致每个后续的Enqueue()抛出异常("队列关闭").

所以经过一些谷歌搜索我找到了这样的帖子:使用BookSleeve维护一个关于DIY连接管理器的开放Redis连接.如果这是最好的行动方案,我当然可以实施类似的东西.

所以,问题:

  1. RedisConnection在一定时间后定期关闭是否正常?
  2. 我已经看过这个conn.SetKeepAlive()方法,但我尝试了许多不同的值,似乎没有任何区别.还有更多的东西,还是我在错误的树上吠叫?
  3. 从上面的帖子开始,连接管理器的想法是处理这种情况的最佳方法吗?
  4. 任何人都可以解释为什么在新的Azure VM中托管我的Redis实例导致此问题?我还可以确认,如果我针对Azure Redis VM运行本地环境,我会遇到此问题.

就像我说的那样,如果Redis连接在不活动后死亡是不寻常的,那么当我回到家时,我会从我的日志中发布堆栈跟踪和异常.

谢谢!

更新 Didier在评论中指出,这可能与Azure使用的负载balanacer有关:http://blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-超时details.aspx

假设是这种情况,那么实现可以解决这个愚蠢问题的连接管理器的最佳方法是什么.我假设我不应该为每个工作单元创建一个连接吗?

Mar*_*ell 6

从其他答案/评论中,听起来这是由于天蓝色基础设施关闭看起来空闲的套接字引起的.您可以在某处定期执行某种操作,但请注意,这已经内置到Booksleeve中:当它连接时,它会检查redis连接超时是什么,并配置心跳以防止redis关闭套接字.您也许可以背负这个以防止天蓝色关闭插座.例如,在redis-cli会话中:

config set timeout 30
Run Code Online (Sandbox Code Playgroud)

应该配置redis(在运行中,无需重新启动)以获得30秒的连接超时.书架应该自动采取措施确保在30秒之前不久有心跳.请注意,如果成功,您还应编辑配置文件,以便在下次重新启动后应用此设置.