我最近开始在新的Azure VM上托管我的一个侧面项目。该应用程序使用Redis作为内存缓存。在我的本地环境中,一切都运行良好,但现在我已经将代码移动到Azure了,我看到书架上出现了一些奇怪的异常。
当应用程序首次启动时,一切正常。但是,在大约5-10分钟的不活动后,对应用程序的下一个请求会遇到网络异常(我现在正在工作,并且没有确切的错误消息,所以当我回到家时我会发布它们人们认为它们与讨论密切相关)这导致内部MessageQueue关闭,这导致每个后续Enqueue()抛出异常(“队列已关闭”)。
所以经过一些谷歌搜索后,我发现了这个SO帖子:Maintaining an open Redis connection using BookSleeve关于DIY连接管理器。如果这是最好的行动方案,我当然可以实施类似的东西。
所以,问题:
conn.SetKeepAlive()
方法,但我尝试了很多不同的值,似乎没有任何区别。还有更多这个还是我咆哮着错误的树?就像我说的,如果Redis连接在不活动后死亡是不寻常的,我会在回家时发布我的日志中的堆栈跟踪和异常。
谢谢!
更新 Didier在评论中指出,这可能与Azure使用的负载balanacer有关:http://blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-timeout-details.aspx
假设情况如此,那么实现可以解决这个愚蠢问题的连接管理器的最佳方法是什么。我假设我不应该为每个工作单元创建一个连接吗?
答案 0 :(得分:6)
从其他答案/评论中,听起来这是由于天蓝色基础设施关闭看起来空闲的套接字引起的。你可能只是在某处定时执行某种操作的计时器,但请注意,这已经内置到Booksleeve中:当它连接时,它会检查redis连接超时是什么,并将心跳配置为防止redis关闭套接字。您也许可以背负这个以防止天蓝色关闭插座。例如,在redis-cli会话中:
config set timeout 30
应该配置redis(在运行中,无需重新启动)以获得30秒的连接超时。书架应该自动采取措施确保在30秒之前不久有心跳。请注意,如果成功,您还应编辑配置文件,以便在下次重新启动后应用此设置。
答案 1 :(得分:1)
Windows Azure中的Load Balancer将在X时间长度取决于负载均衡器上的总连接负载后关闭连接,因此您将在连接中获得随机超时。
由于我对Redis连接并不熟悉,因此我无法建议如何正确实现它,但一般而言,建议的解决方法是让心跳脉冲保持会话活跃。您是否有机会寻找博客中建议的解决方法并尝试在Redis中实施,如果这对您有用?