Node-redis: retry_strategy์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด on(error) ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 07์›” 21์ผ  ยท  10์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: NodeRedis/node-redis

  • ๋ฒ„์ „ : ๋…ธ๋“œ 4.2.1, redis 2.6.2
  • ํ”Œ๋žซํผ : ๋งฅ OS 10.11.5
  • ์„ค๋ช… :

์ผ์ • ํšŸ์ˆ˜์˜ ์žฌ์‹œ๋„ ํ›„์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” retry_strategy๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Redis์˜ on('error') ํ•ธ๋“ค๋Ÿฌ๋กœ ๋ฒ„๋ธ”๋ง๋˜์–ด ๊ธฐ๋ก๋˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. redis ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ 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 ๋Œ“๊ธ€

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์˜๋„์ ์œผ๋กœ ์ˆ˜ํ–‰๋œ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹คํŒจํ–ˆ๋‹ค๋Š” ์ •๋ณด๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฏ€๋กœ ๋” ์ด์ƒ ๋‚ด๋ณด๋‚ผ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ semver๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ข‹์€ ๋ณ€ํ™”๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค./ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ์ž‘์€ ์„ค๋ฌธ์กฐ์‚ฌ๋ฅผ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•‘ @NodeRedis/๊ธฐ๊ณ ์ž @dirkbonhomme

์˜ˆ: ์˜ค๋ฅ˜ ์ˆ˜์‹ ๊ธฐ์— ์˜ค๋ฅ˜๋ฅผ ๋ฒ„๋ธ”๋งํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ์˜ค: ํ˜„์žฌ ์†”๋ฃจ์…˜ ์œ ์ง€

์ „์ž๋ฅผ ์œ„ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด connect-redis ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ retry_strategy ์™€ (๋ถ„๋ช…ํžˆ) ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ด ๋˜๋Š” logErrors ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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 ์‚ฌ์šฉํ•  ๋•Œ ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” redis ์—ฐ๊ฒฐ ์—†์ด ์„œ๋น„์Šค๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์€ ์—†์œผ๋ฉฐ ์ด๋Š” ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์€ ์•„๋งˆ๋„ @AaronJan์ด ์ œ์•ˆํ•œ ๋ณ„๋„์˜ ์ด๋ฒคํŠธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ œ error ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊นŒ์ง€ ๋ฐ˜ํ™˜๋œ retry_strategy ์˜ค๋ฅ˜๋ฅผ ๋ฒ„๋ธ”๋งํ•˜๋Š” v3.0.0์„ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰