Как исправить проблему ожидания ответа при использовании кэша Azure Redis?

#asp.net-core #stackexchange.redis #azure-redis-cache

#asp.net-core #stackexchange.redis #azure-redis-cache

Вопрос:

У меня есть метод, который принимает входные данные в виде списка и сохраняет каждый элемент в кэше Azure Redis.

 public async Task<bool> StoreAsBatch<T>(T data)
        {
            var storeData = new List<Task<bool>>();
            try
            {
                foreach (var each in data as List<EmpUser>)
                {
                    storeData.Add(Store(each.UserId, each));
                }

                await Task.WhenAll(storeData).ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                _logger.LogError($"StoreAsBatch failed with an exception - {ex.Message} ");
                return false;
            }
            
            return true;
        }
  

Вот метод хранения

 public async Task<bool> Store<T>(string key, T value)
        {
            if (string.IsNullOrEmpty(key))
                throw new ArgumentException(nameof(key));
            key = $"emp_user_{key}";
            string val = JsonConvert.SerializeObject(value);
            return await _database.StringSetAsync(key, JsonConvert.SerializeObject(value), new TimeSpan(30, 0, 0, 0,0));
        }
  

Когда я передаю список (размер списка: 1 тыс. записей) в указанный выше метод StoreAsBatch. Я получаю исключение, подобное этому
Ошибка

 Timeout awaiting response (outbound=0KiB, inbound=0KiB, 7625ms elapsed, timeout is 5000ms), command=SETEX, next: SETEX emp_user_00mb1, inst: 0, qu: 0, qs: 1, aw: True, rs: DequeueResult, ws: Writing, in: 0, serverEndpoint: mrcooper-originations-boss-dev.redis.cache.windows.net:6380, mc: 1/1/0, mgr: 9 of 10 available, clientName: WIN10H-DLPIH45D, IOCP: (Busy=0,Free=1000,Min=8,Max=1000), WORKER: (Busy=2,Free=32765,Min=8,Max=32767), v: 2.1.58.34321 (Please take a look at this article for some common client-side issues that can cause timeout) 
  

Я новичок в кэше Azure Redis. Пожалуйста, помогите мне устранить ошибку.

Заранее спасибо.

Комментарии:

1. Ошибка сообщает вам, что происходит. Вы пытаетесь записать 1 тыс. элементов, на это вашему приложению требуется 7,6 секунды, и вы настроили Redis на тайм-аут через 5 секунд. Либо увеличьте пороговое значение времени ожидания, либо не сохраняйте JSON с 1k элементами в нем

2. @CamiloTerevinto, где я могу увеличить время ожидания. Не могли бы вы мне помочь. это должно быть сделано со стороны кода?

3. Документация — ваш друг: stackexchange.github.io/StackExchange . Redis / Конфигурация

Ответ №1:

На основе предложений @CamiloTervinto и ссылки на эту документацию по конфигурации Redis.

Я могу устранить свою ошибку, увеличив пороговое время для асинхронных вызовов при настройке кэша redis.

Вот ссылочный код.

Способ 1

 public void SetUpCacheManager()
        {
            try
            {
                _lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
                { 
                    string connectionString = _config.AzureRedis.HostName   _config.AzureRedis.Password   _config.AzureRedis.Ssl;
                    var redisConfig = ConfigurationOptions.Parse(connectionString);
                    redisConfig.AsyncTimeout = 15000;
                    return ConnectionMultiplexer.Connect(redisConfig);
                });

                _database = Connection.GetDatabase();
            }
            catch(Exception e)
            {
                _logger.LogError($"(SetUpCacheManager): Exception in Connecting to Cache, Message: {e.Message}");
            }  
        }
  

Способ 2

         public async Task<bool> StoreAsBatch(List<EncompassUser> data)
        {
            Parallel.ForEach(data, new ParallelOptions{MaxDegreeOfParallelism =  10 }, (obj) =>
            {
                    try
                    {
                        Store(obj.UserId, obj);
                    }
                    catch (Exception ex)
                    {
                        _logger.LogError($"StoreAsBatch failed with an exception - {ex.Message} ");
                    }
            });
            return true;
        }