我最近开始在新的 Azure VM 上托管我的一个业余项目。该应用程序使用 Redis 作为内存缓存。在我的本地环境中一切都工作正常,但现在我已将代码移至 Azure,我发现 Booksleeve 出现了一些奇怪的异常。
当应用程序第一次启动时,一切正常。但是,在大约 5-10 分钟不活动后,对应用程序的下一个请求会遇到网络异常(我现在正在工作,没有确切的错误消息,所以我会在回家时发布它们,如果人们认为它们与讨论密切相关)这会导致内部 MessageQueue 关闭,从而导致每个后续的 Enqueue() 抛出异常(“队列已关闭”)。
所以经过一番谷歌搜索后我发现了这个帖子:使用 BookSleeve 维护开放的 Redis 连接 https://stackoverflow.com/questions/8645953/maintaining-an-open-redis-connection-using-booksleeve关于 DIY 连接管理器。如果这是最好的行动方案,我当然可以实施类似的措施。
那么,问题:
- RedisConnection 在一定时间后定期关闭是否正常?
- 我见过
conn.SetKeepAlive()
方法,但我尝试了许多不同的值,但似乎没有一个有什么不同。还有更多的事情吗,还是我找错了树?
- 上面帖子中的连接管理器想法是处理这种情况的最佳方法吗?
- 谁能进一步解释为什么在新的 Azure VM 中托管我的 Redis 实例会导致此问题?我还可以确认,如果我针对 Azure Redis VM 运行本地环境,我会遇到此问题。
就像我说的,如果 Redis 连接在不活动后中断的情况很常见,我会在回家后发布堆栈跟踪和日志中的异常。
Thanks!
UPDATEDidier在评论中指出,这可能与Azure使用的负载均衡器有关:http://blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-timeout-details.aspx http://blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-timeout-details.aspx
假设是这种情况,那么实现可以解决这个愚蠢问题的连接管理器的最佳方法是什么。我认为我不应该为每个工作单元创建一个连接,对吧?
从其他答案/评论来看,这听起来像是由天蓝色基础设施关闭看起来空闲的套接字引起的。你could只需在某个地方有一个计时器,定期执行某种操作,但请注意,这已经内置在 Booksleeve 中:当它连接时,它会检查 redis 连接超时时间,并配置一个心跳以防止 redis 关闭套接字。您也许可以使用它来防止 azure 也关闭套接字。例如,在 redis-cli 会话中:
config set timeout 30
应将 Redis 配置为(即时,无需重新启动)具有 30 秒的连接超时。然后,Booksleeve 应自动采取措施,确保在 30 秒之前不久出现心跳。请注意,如果成功,您还应该编辑配置文件,以便在下次重新启动后也应用此设置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)