Какой тайм-аут по умолчанию для команды ioredis send для любого вызова redis - PullRequest
0 голосов
/ 28 марта 2019

Я использую ioredis с приложением узла, и из-за некоторых проблем в кластере я начал получать:

Слишком много перенаправлений кластера. Последняя ошибка: ошибка: соединение закрыто.

Из-за этого все мои вызовы redis не были выполнены и через очень долгое время, от 1 секунды до 130 секунд.

Есть ли время ожидания по умолчанию для библиотеки ioredis, которую она использует для подтверждения вызова после отправки команды на выполнение на сервер redis?

Более высокое время сбоя в диапазоне 100 с при отправке команд на сервер Redis, это связано с тем, что большой размер очереди при Redis из-за сбоя кластера?

Пример кода:

this.getData = function(bucketName, userKey) {
  let cacheKey = cacheHelper.formCacheKey(userKey, bucketName);
  let serviceType = cacheHelper.getServiceType(bucketName, cacheConfig.service_config);
  let log_info = _.get(cacheConfig.service_config, 'logging_options.cache_info_level', true);
  let startTime = moment();
  let dataLength = null;
  return Promise.try(function(){
    validations([cacheKey], ['cache_key'], bucketName, serviceType, that.currentService);
    return cacheStore.get(serviceType, cacheKey);
  })
  .then(function(data) {
    dataLength = (data || '').length;
    return cacheHelper.uncompress(data);
  })
  .then(function(uncompressedData) {
    let endTime = moment();
    let responseTime = endTime.diff(startTime, 'miliseconds');
    if(!uncompressedData) {
      if(log_info) logger.consoleLog(bucketName, 'getData', 'miss', cacheKey, that.currentService,
        responseTime, dataLength);
    } else {
      if(log_info) logger.consoleLog(bucketName, 'getData', 'success', cacheKey, that.currentService,
        responseTime, dataLength);
    }
    return uncompressedData;
  })
  .catch(function(err) {
    let endTime = moment();
    let responseTime = endTime.diff(startTime, 'miliseconds');
    logger.error(bucketName, 'getData', err.message, userKey, that.currentService, responseTime);
    throw cacheResponse.error(err);
  });
};

Здесь logger.error(bucketName, 'getData', err.message, userKey, that.currentService, responseTime);

начал давать время отклика в диапазоне от 1061 мс до 109939 мс.

Пожалуйста, предоставьте некоторые данные.

1 Ответ

0 голосов
/ 28 марта 2019

Как вы можете прочитать из этой проблемы с ioredis , нет настройки времени ожидания для каждой команды.

Как указано в связанном комментарии, вы можете использовать стратегию на основе Promiseкак обходной путь.Между прочим, это та же самая стратегия, которая используется в плагине ioredis-timeout , который оборачивает исходную команду в методе Promise.race():

//code from the ioredis-timeout lib
return Promise.race([
      promiseDelay(ms, command, args),
      originCommand.apply(redis, args)
]);

Таким образом, вы можетеиспользуйте плагин или эту замечательную race технику тайм-аута , чтобы добавить функцию тайм-аута поверх клиента Redis.Помните, что основная команда не будет прервана.

...