2017-10-16 58 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

相關問題