【问题标题】:Redis connection errors when using Booksleeve Redis client in Azure VM在 Azure VM 中使用 Booksleeve Redis 客户端时出现 Redis 连接错误
【发布时间】:2012-06-15 13:02:42
【问题描述】:

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

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

所以经过一番谷歌搜索后,我发现了这个 SO 帖子:Maintaining an open Redis connection using BookSleeve 关于 DIY 连接管理器。如果这是最好的做法,我当然可以实现类似的东西。

所以,问题:

  1. RedisConnection 在一定时间后周期性关闭是否正常?
  2. 我见过conn.SetKeepAlive() 方法,但我尝试了许多不同的值,但似乎没有任何区别。还有更多的原因还是我找错了树?
  3. 上面帖子中的连接管理器想法是处理这种情况的最佳方法吗?
  4. 谁能进一步说明为什么在新的 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


【解决方案1】:

从其他答案/cmets 看来,这听起来像是由 azure 基础设施关闭看起来空闲的套接字引起的。你可以简单地在某处有一个定时器来定期执行某种操作,但请注意这已经内置在 Booksleeve 中:当它连接时,它会检查 redis 连接超时时间,并配置一个心跳来防止redis关闭套接字。您也许可以背负这个以防止天蓝色也关闭套接字。例如,在 redis-cli 会话中:

config set timeout 30

应配置 redis(即时,无需重新启动)具有 30 秒的连接超时。然后,Booksleeve 应自动采取措施确保在 30 秒前不久有心跳。请注意,如果这成功了,您还应该编辑配置文件,以便在下次重新启动后也应用此设置。

【讨论】:

  • 值得指出的是,当设置 conn.SetKeepAlive(true) 时,您需要在此处实际设置超时 > 0 以便 Booksleeve 执行自动 Ping() 检查。因此,在 Azure 上,您需要如上所述将超时设置为 30 秒,并且还需要 conn.SetKeepAlive(true)。如果没有设置配置超时,Booksleeve 不会进行 ping 检查(即使 keepalive = true,当没有设置超时时,Booksleeve 内部的内部检查也会跳过 ping)。这意味着 Azure 仍会由于不活动而关闭套接字。
  • 如果 redis 配置中存在超时,StackExchange.Redis 是否具有相同的心跳行为?
  • @slypete 是的,但如果没有超时,它也有一个默认的心跳
【解决方案2】:

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

由于我对 Redis 连接并不熟悉,因此我无法建议如何正确实现它,但通常建议的解决方法是使用心跳脉冲来保持会话处于活动状态。您是否有机会寻找博客中建议的解决方法并尝试在 Redis 中实现,如果这对您有用?

【讨论】:

  • 谢谢阿夫卡什。我实际上打算在新的 Azure 预览版中尝试使用虚拟网络,但不幸的是,我不允许从自定义映像创建 VM 并将其添加到 Affinity 组。显然这只允许从快速创建屏幕?我也向虚拟网络论坛提交了一个论坛帖子。
  • 您好,Eric,我看到了您的帖子,可以在 VM 创建问题上为您提供帮助,但是 MSDN 论坛存在一些问题,所以我无法联系您。一旦解决了,我将与您联系,看看可以做什么..谢谢..
  • 我相信我知道发生了什么。显然,我创建的图像仅在它开始使用的位置(美国西部)可用 - 我在图像之后创建了 vlan,现在看来无法将图像从一个位置移动到另一个位置。从性能的角度来看,您是否知道创建 vlan 是否会明显更好?我的意思是,如果需要的话,在我的应用程序中创建一个心跳并不太麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 2011-09-12
相关资源
最近更新 更多