2017-10-16 60 views
0

我们用下面的代码连接到我们的高速缓存(在内存和Redis的):连接到Redis的缓存重启后失败 - 天青

settings .WithSystemRuntimeCacheHandle() .WithExpiration(CacheManager.Core.ExpirationMode.Absolute, defaultExpiryTime) .And .WithRedisConfiguration(CacheManagerRedisConfigurationKey, connectionString) .WithMaxRetries(3) .WithRetryTimeout(100) .WithJsonSerializer() .WithRedisBackplane(CacheManagerRedisConfigurationKey) .WithRedisCacheHandle(CacheManagerRedisConfigurationKey, true) .WithExpiration(CacheManager.Core.ExpirationMode.Absolute, defaultExpiryTime);

它工作正常,但有时机器重新启动(自动通过Azure的,我们对其进行托管)和失败,以下异常重启连接的Redis后:

Connection to '{connection string}' failed. at CacheManager.Core.BaseCacheManager`1..ctor(String name, ICacheManagerConfiguration configuration) at CacheManager.Core.BaseCacheManager`1..ctor(ICacheManagerConfiguration configuration) at CacheManager.Core.CacheFactory.Build[TCacheValue](String cacheName, Action`1 settings) at CacheManager.Core.CacheFactory.Build(Action`1 settings)

根据Redis的FAQ(https://docs.microsoft.com/en-us/azure/redis-cache/cache-faq)部分:“为什么我的客户端是否与缓存断开连接?“它可能在重新部署后发生。

的问题是

  • 没有任何机制来恢复连接之后重新部署
  • 什么不好的方式,我们初始化连接

我们相信在连接字符串OK

+1

在应用程序启动时,如果Redis不可用,CacheManager将抛出该异常。虽然你可以增加connectionTimeout属性,也许有帮助。您可以手动重试初始化几次...启动后,连接(如果建立一次)应该在Redis服务器自动停机后自动恢复...... – MichaC

回答

1

大多数客户端(包括StackExchange.Redis)通常在连接中断后自动连接/重新连接。但是,连接超时设置需要足够大才能重新连接成功发生。记住,你只连接一次,所以给系统足够的时间来重新连接是可以的。当连接突然中断或连接重新连接导致CPU尖峰并且某些连接可能不会及时发生时,更高的连接超时特别有用。

在这种情况下,我将RetryTimeout看作100.如果这是连接超时,请检查它是否以毫秒为单位。 100毫秒太低。你可能想让这个更像10秒(记住它是一次性的,所以你想给它时间来连接)。

+0

听起来像是一个好主意。但即使超时连接时间过短也应在一段时间后恢复。但在我们的情况下,它永远不会恢复。你有什么解释吗? – jabko87

+0

你在使用SignalR吗?如果不是,您使用的是什么技术? SignalR有一个已知的问题在这里描述:https://github.com/SignalR/SignalR/issues/4019。此外,请确保您没有使用Redis的基本SKU - 这是一个单一节点,如果操作系统得到修补,它将在修补程序完成之前无法访问。 – JonCole

相关问题