C# 在Azure VM中使用Booksleeve Redis客户端时出现Redis连接错误

C# 在Azure VM中使用Booksleeve Redis客户端时出现Redis连接错误,c#,azure,redis,booksleeve,C#,Azure,Redis,Booksleeve,我最近开始在新的Azure虚拟机上主持我的一个附带项目。该应用程序使用Redis作为内存缓存。在我的本地环境中一切都很好,但现在我已经将代码移动到Azure,我看到一些奇怪的异常出现在书架上 当应用程序第一次启动时,一切正常。然而,在大约5-10分钟的不活动后,下一个应用程序请求遇到网络异常(我现在正在工作,没有确切的错误消息,因此如果人们认为他们与讨论有密切关系,我会在回家后发布这些消息),这会导致内部消息队列关闭,这会导致后续的每个Enqueue()抛出异常(“队列已关闭”) 所以,在谷歌搜

我最近开始在新的Azure虚拟机上主持我的一个附带项目。该应用程序使用Redis作为内存缓存。在我的本地环境中一切都很好,但现在我已经将代码移动到Azure,我看到一些奇怪的异常出现在书架上

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

所以,在谷歌搜索之后,我发现了这样一个帖子:关于DIY连接管理器。如果这是最好的做法,我当然可以实施类似的措施

因此,问题是:

  • 重新连接在一定时间后定期关闭是否正常
  • 我见过
    conn.SetKeepAlive()
    方法,但我尝试了许多不同的值,但似乎没有一个值起作用。还有别的吗?还是我找错人了
  • 上面文章中的连接管理器是处理这种情况的最佳方法吗
  • 有人能解释为什么在新的Azure VM中托管我的Redis实例会导致这个问题吗?我还可以确认,如果我针对Azure Redis VM运行本地环境,我会遇到此问题
  • 正如我所说,如果Redis连接在不活动后死亡是不寻常的,我会在回家后发布日志中的堆栈跟踪和异常

    谢谢

    更新 Didier在评论中指出,这可能与Azure使用的负载平衡器有关:


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

    Microsoft Azure中的负载平衡器将在X个时间后关闭连接,这取决于负载平衡器上的总连接负载,因此,您的连接将随机超时


    由于我对Redis connections不太了解,因此我无法建议如何正确地实现它,但一般来说,建议的解决方法是使用心跳脉冲来保持会话活动。您是否有机会寻找博客中建议的解决方法,并尝试在Redis中实现,如果这对您有效的话

    从其他答案/评论来看,这似乎是由azure基础设施关闭看起来空闲的套接字造成的。您只需在某个地方设置一个计时器,定期执行某种操作,但请注意,这已经内置在BookSheeve中:当它连接时,它会检查redis连接超时,并配置心跳以防止redis关闭套接字。您可能可以利用它来防止azure也关闭套接字。例如,在redis cli会话中:

    config set timeout 30
    

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

    Redis配置文件的超时参数中有什么?这是空闲超时(将其设置为0以避免Redis关闭空闲连接)。超时已设置为0。我也仔细检查了一下(这似乎是AzureVM的一项“功能”…出于好奇,请参阅@Eric-您的redis服务器是否配置了连接超时?如果是这样,BookSleeve应该自动配置自己的心跳…也许这会阻止负载平衡器杀死它?@Eric 3600是一个小时…知道azure杀死时间是多少吗?我会说“短于此”。请注意,这只是为了看看booksleeve的心跳是否会使TCP保持活动状态-如果它工作,我们可能可以让它工作,而无需您更改配置。作为一个小提示:您不需要重新启动redis来更改连接超时-非常确定您可以在redis cli(或类似)中执行此操作SessionTanks Avkash。我本来打算在新的Azure预览中尝试使用虚拟网络,但不幸的是,我不允许从自定义映像创建虚拟机并将其添加到关联组。显然,这只允许从快速创建屏幕进行。我也向虚拟网络论坛提交了论坛帖子。嗨,Eric,我看到了你的帖子,并将能够帮助你的虚拟机创建问题,但有一些问题与MSDN论坛,所以我不能联系你。一旦这是解决我会与你联系,看看可以做些什么…谢谢..我相信我知道发生了什么。显然,我创建的形象是唯一的位置,它开始生活在(美国西部)-我在映像之后创建了vlan,现在似乎不可能将映像从一个位置移动到另一个位置。从性能角度看,您知道创建vlan是否会明显更好吗?我的意思是,如果需要,只在我的应用程序中创建心跳并不太繁重。值得指出的是,您需要在设置conn.SetKeepAlive(true)时,请在此处为Booksleeve设置超时>0以执行自动Ping()检查。因此,在Azure上,您需要如上所述将超时设置为30秒,还需要设置conn.SetKeepAlive(true)。如果未设置配置超时,Booksleeve将不会执行Ping检查(即使使用keepalive=true,当没有设置超时时,Booksleeve中的内部检查也会跳过ping)。这意味着Azure仍然会由于不活动而关闭套接字。StackExchange.Redis是否具有与我相同的心跳行为