6

我最近开始在新的 Azure VM 上托管我的一个副项目。该应用程序使用 Redis 作为内存缓存。在我的本地环境中一切正常,但现在我已将代码移至 Azure,我看到 Booksleeve 出现了一些奇怪的异常。

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

因此,经过一番谷歌搜索后,我发现了这篇 SO 帖子:使用 BookSleeve 维护一个开放的 Redis 连接,关于 DIY 连接管理器。如果这是最好的做法,我当然可以实现类似的东西。

所以,问题:

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

就像我说的,如果 Redis 连接在不活动后断开是不寻常的,我会在我回家时从我的日志中发布堆栈跟踪和异常。

谢谢!

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

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

4

2 回答 2

6

From other answers/comments, it sounds like this is caused by the azure infrastructure shutting down sockets that look idle. You could simply have a timer somewhere that performs some kind of operation periodically, but note that this is already built into Booksleeve: when it connects, it checks what the redis connection timeout is, and configures a heartbeat to prevent redis from closing the socket. You might be able to piggy-back this to prevent azure closing the socket too. For example, in a redis-cli session:

config set timeout 30

should configure redis (on the fly, without having to restart) to have a 30 second connection timeout. Booksleeve should then automatically take steps to ensure that there is a heartbeat shortly before 30 seconds. Note that if this is successful, you should also edit your configuration file so that this setting applies after the next restart too.

于 2012-06-14T06:36:41.460 回答
1

Windows Azure 中的负载均衡器将在 X 时间后关闭连接,具体取决于负载均衡器上的总连接负载,因此您的连接将随机超时。

As I am not well known to Redis connections I am unable to suggest how to implement it correctly however in general the suggested workaround is the have a heartbeat pulse to keep your session alive. Have you have chance to look for the workaround suggested in blog and try to implement in Redis, if that works out for you?

于 2012-06-12T22:29:41.407 回答