1

次のコードを使用して、キャッシュ (メモリ内および 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 ) の部分によると、「クライアントがキャッシュから切断されたのはなぜですか?」再デプロイ後に発生する可能性があります。

質問は

  • 再デプロイ後に接続を復元するメカニズムはありますか
  • 接続を初期化する方法に何か問題がありますか

接続文字列は問題ないと確信しています

4

1 に答える 1

2

ほとんどのクライアント (StackExchange.Redis を含む) は通常、接続が切断された後に自動的に接続/再接続します。ただし、接続タイムアウトの設定は、再接続が正常に行われるように十分大きくする必要があります。接続は 1 回だけなので、再接続できるようにシステムに十分な時間を与えても問題ないことに注意してください。接続タイムアウトを長くすると、接続のバーストやブリップの後に再接続が発生して CPU のスパイクが発生し、一部の接続が間に合わない可能性がある場合に特に役立ちます。

この場合、RetryTimeout が 100 と表示されます。これが接続タイムアウトの場合は、ミリ秒単位かどうかを確認してください。100 ミリ秒は短すぎます。これを 10 秒程度にしたい場合があります (これは 1 回限りのことなので、接続できるようになるまでの時間を考慮してください)。

于 2017-10-17T00:46:03.523 に答える