我最近开始在新的 Azure VM 上托管我的一个副项目。该应用程序使用 Redis 作为内存缓存。在我的本地环境中一切正常,但现在我已将代码移至 Azure,我看到 Booksleeve 出现了一些奇怪的异常。
当应用程序首次启动时,一切正常。但是,在大约 5-10 分钟不活动后,对应用程序的下一个请求遇到网络异常(我现在在工作,没有确切的错误消息,所以我会在我回家时发布它们,如果人们认为他们与讨论密切相关)这会导致内部 MessageQueue 关闭,从而导致每个后续 Enqueue() 抛出异常(“队列已关闭”)。
因此,经过一番谷歌搜索后,我发现了这篇 SO 帖子:使用 BookSleeve 维护一个开放的 Redis 连接,关于 DIY 连接管理器。如果这是最好的做法,我当然可以实现类似的东西。
所以,问题:
- RedisConnection 在一定时间后定期关闭是否正常?
- 我已经看到了这种
conn.SetKeepAlive()
方法,但我尝试了许多不同的值,但似乎都没有什么不同。还有更多吗,还是我在吠叫错误的树? - 上面帖子中的连接管理器想法是处理这种情况的最佳方法吗?
- 谁能进一步说明为什么在新的 Azure VM 中托管我的 Redis 实例会导致此问题?我还可以确认,如果我针对 Azure Redis VM 运行本地环境,我会遇到此问题。
就像我说的,如果 Redis 连接在不活动后断开是不寻常的,我会在我回家时从我的日志中发布堆栈跟踪和异常。
谢谢!
更新 Didier 在评论中指出,这可能与 Azure 使用的负载均衡器有关:http: //blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-超时详细信息.aspx
假设是这种情况,实现可以解决这个愚蠢问题的连接管理器的最佳方法是什么。我认为我不应该为每个工作单元创建一个连接,对吗?