【发布时间】:2012-06-15 13:02:42
【问题描述】:
我最近开始在新的 Azure VM 上托管我的一个副项目。该应用程序使用 Redis 作为内存缓存。在我的本地环境中一切正常,但现在我已将代码移至 Azure,我看到 Booksleeve 出现了一些奇怪的异常。
当应用首次启动时,一切正常。但是,在大约 5-10 分钟不活动后,对应用程序的下一个请求遇到网络异常(我现在在工作,没有确切的错误消息,所以我会在我回家时发布它们,如果人们认为他们与讨论密切相关)这会导致内部 MessageQueue 关闭,从而导致每个后续 Enqueue() 抛出异常(“队列已关闭”)。
所以经过一番谷歌搜索后,我发现了这个 SO 帖子:Maintaining an open Redis connection using BookSleeve 关于 DIY 连接管理器。如果这是最好的做法,我当然可以实现类似的东西。
所以,问题:
- RedisConnection 在一定时间后周期性关闭是否正常?
- 我见过
conn.SetKeepAlive()方法,但我尝试了许多不同的值,但似乎没有任何区别。还有更多的原因还是我找错了树? - 上面帖子中的连接管理器想法是处理这种情况的最佳方法吗?
- 谁能进一步说明为什么在新的 Azure VM 中托管我的 Redis 实例会导致此问题?我还可以确认,如果我针对 Azure Redis VM 运行本地环境,我会遇到此问题。
就像我说的,如果 Redis 连接在不活动后断开是不寻常的,我会在回家后从我的日志中发布堆栈跟踪和异常。
谢谢!
更新 Didier 在 cmets 中指出,这可能与 Azure 使用的负载均衡器有关:http://blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-timeout-details.aspx
假设是这种情况,实现连接管理器以解决这个愚蠢问题的最佳方法是什么。我认为我不应该为每个工作单元创建一个连接,对吗?
【问题讨论】:
-
Redis配置文件的timeout参数里有什么?这是空闲超时(将其设置为 0 以避免 Redis 关闭空闲连接)。
-
超时已设置为 0。只需仔细检查它。 :(
-
这似乎是 AzureVM 的一个“特性”...见blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/…
-
@Eric 出于好奇-您的 redis 服务器是否配置了连接超时?如果是这样,BookSleeve 应该自动配置自己的心跳......也许这会阻止负载均衡器杀死它?
-
@Eric 3600 是一个小时......知道天蓝色的杀戮时间是多少吗?我会说“比那更短”。请注意,这只是为了查看 bookleeve 的心跳是否会保持 TCP 活动 - 如果它有效,我们可能可以让它工作而无需更改配置。作为一个小提示:你不需要重新启动 redis 来更改连接超时 - 很确定你可以在 redis-cli (或类似的)会话中做到这一点
标签: c# azure redis booksleeve