Node-redis: retry_strategy рд╕реЗ рд▓реМрдЯрдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ (рддреНрд░реБрдЯрд┐) рдШрдЯрдирд╛ рдкрд░ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 21 рдЬреБрд▓ре░ 2016  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: NodeRedis/node-redis

  • рд╕рдВрд╕реНрдХрд░рдг : рдиреЛрдб 4.2.1, рд░реЗрдбрд┐рд╕ 2.6.2
  • рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдо : рдореИрдХ рдУрдПрд╕ 10.11.5
  • рд╡рд┐рд╡рд░рдг :

рд╣рдордиреЗ рдПрдХ retry_strategy рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдкреБрдирд░реНрдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдмрд╛рдж рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рдпрд╣ рд░реЗрдбрд┐рд╕ рдХреЗ рдСрди ('рддреНрд░реБрдЯрд┐') рд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдмрд▓ рд╣реЛрдЧрд╛ред рд╣рдорд╛рд░реА рд░реЗрдбрд┐рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ 2.4.2 рд╕реЗ 2.6.2 рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдм рдкрд╣рд▓реЗ рдЬреИрд╕рд╛ рдирд╣реАрдВ рд░рд╣рд╛ред

рд░реЗрдкреНрд░реЛ рдХреЗрд╕:

const redis = require('redis');
const MAX_ATTEMPTS = 10;
var client = redis.createClient(port, host, { 
  retry_strategy: redisRetryStrategy
});
client.on('error', onError);

function OnError(err) {
  console.log(err);
  throw new Error('SHUTDOWN THE APP, REDIS IS NOT RESPONDING??');
}

function redisRetryStrategy(host, options) {
  if (options.attempt >= MAX_ATTEMPTS) {
    // Stop reconnecting after reaching the maximum number of attempts
    return new Error('Maximum redis reconnect attempts reached');
  }
  return 1000; // Schedule next reconnection attempt after 1 sec.
}

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рд╛рдВ: рддреНрд░реБрдЯрд┐ рд╢реНрд░реЛрддрд╛ рдХреЛ рддреНрд░реБрдЯрд┐ рдмрдмрд▓ рдХрд░реЗрдВ

рд╕рднреА 10 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЕрдм рдФрд░ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реЗрд╡рд░ рдХреЛ рдКрдкрд░ рд░рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реИ: / рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред

рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рджреВрд╕рд░реЗ рд▓реЛрдЧ рдХреНрдпрд╛ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВред рдкрд┐рдВрдЧ @NodeRedis/рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ @dirkbonhomme

рд╣рд╛рдВ: рддреНрд░реБрдЯрд┐ рд╢реНрд░реЛрддрд╛ рдХреЛ рддреНрд░реБрдЯрд┐ рдмрдмрд▓ рдХрд░реЗрдВ

рдирд╣реАрдВ: рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди рд░рдЦреЗрдВ

рдкреВрд░реНрд╡ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдиреЗрдХреНрдЯ-рд░реЗрдбрд┐рд╕ рдПрдХ logErrors рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ (рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ) retry_strategy рд╕рд╛рде рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдирдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдмреБрд▓рдмреБрд▓рд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВред

new RedisStore({
  logErrors: (err) => console.error, // does nothing
  retry_strategy: (options) => {
    if (options.error.code === 'ECONNREFUSED' || options.error.code === 'ENOTFOUND') {
      return new Error('The server could not be found or refused the connection');
    }
    return 1000;
  }
})

@tj

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рддрдм рддрдХ рдареАрдХ рд╣реИ рдЬрдм рддрдХ рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рд╣реИ, рдЬреЛ рдпрд╣ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдЧрд╛ рдЬреЛ рдЕрднреА рднреА рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рд░рдгрдиреАрддрд┐ рд╕реЗ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрдмрд▓ рдЕрдк рдХрд░реЗрдЧрд╛ред
рднреВрддрдкреВрд░реНрд╡ред:

redis.createClient({
    retry_strategy: ...,
    retry_strategy_bubble_up: true or false (default to false to keep existing functionality)
});

рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рдмрд╕ рдЖрдЦрд┐рд░реА рджрд┐рди рдмрд┐рддрд╛рдпрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд▓реЙрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХреА рдЬрд╛ рд░рд╣реА рдереАрдВред рдЕрдм рдЬрдм рд▓реЙрдЧрд┐рдВрдЧ retry_strategy рдХреЙрд▓рдмреИрдХ рдореЗрдВ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐ рдИрд╡реЗрдВрдЯ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдкрдХрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

retry_strategy: function(options) {
            logger.debug('Retry redis connection: ', options.attempt);

            // 5 mins
            if (options.total_retry_time > 1000 * 60 * 5) {
                // End reconnecting after a specific timeout and flush all commands with a individual error
                return logger.error('Redis: maximum retry time exhausted');
            }
            if (options.attempt > 5) {
                // End reconnecting with built in error
                logger.error('Redis: maximum connection retry reached');
                return client.emit('error', 'maximum retry');
            }
            return 1000 * 2;
        },

рдмреБрд▓рдмреБрд▓рд╛ рдЙрдардирд╛ ! (рдпрд╛ рдХреБрдЫ рдФрд░)

рдХрд╕реНрдЯрдо рдПрд░рд░ рдПрдорд┐рдЯрд░ рдЬреИрд╕реЗ @alannesta рдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ, retry_strategy рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЗрд╕реЗ рдлрдВрдХреНрд╢рди рдХреЗ рдмрд╛рд╣рд░ рдХреА рд╡рд╕реНрддреБ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред

NodeRedis рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдИрд╡реЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо рдерд╛, рдмрд╕ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ!

рдЪреВрдВрдХрд┐ end рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ "рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рд╣реИ", рд╣рдо рдПрдХ рдирдИ рдШрдЯрдирд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ (рдЪрд▓рд┐рдП рдЗрд╕реЗ рдЕрднреА "рд╢рдЯрдбрд╛рдЙрди" рдХрд╣рддреЗ рд╣реИрдВ) рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ "рд╣рдордиреЗ рд╡рд╣ рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ рдЬреЛ рд╣рдо рдХрд░ рд╕рдХрддреЗ рдереЗ, рдпрд╣ рдХрдиреЗрдХреНрд╢рди рдорд░ рдЪреБрдХрд╛ рд╣реИ , рдЕрдм рд╕реЗ, рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдХреБрдЫ рд╕рдлрд╛рдИ рдХрд╛рд░реНрдп рдХрд░реЗрдВ"ред

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдХреНрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╣реБрдЖ?

рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рддрдп рдирд╣реАрдВ рд╣реИ рдпрд╛ рд╕рд┐рд░реНрдл рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ? рдШрдЯрдирд╛ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рди рдХрд░рдиреЗ рдХрд╛ рдХреНрдпрд╛ рд▓рд╛рдн рд╣реИ? retry_strategy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд░реЗрдбрд┐рд╕ рдХрдиреЗрдХреНрд╢рди рд╡рд╛рд▓реА рд╕реЗрд╡рд╛ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдмреБрдирд┐рдпрд╛рджреА рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╢рд╛рдпрдж рдПрдХ рдЕрд▓рдЧ рдШрдЯрдирд╛ рд╣реЛрдЧреА рдЬреИрд╕рд╛ рдХрд┐ @AaronJan рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдерд╛ ..

рдореИрдВрдиреЗ v3.0.0 рдЬрд╛рд░реА рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЕрдм retry_strategy рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ error рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рддрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕