์ผ์ ํ์์ ์ฌ์๋ ํ์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ 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.
}
์ด๊ฒ์ ์ค์ ๋ก ์๋์ ์ผ๋ก ์ํ๋ ์์ ์ ๋๋ค. ๊ทธ ์ด์ ๋ ํด๋ผ์ด์ธํธ๊ฐ ์คํจํ๋ค๋ ์ ๋ณด๊ฐ ์ด๋ฏธ ์์ผ๋ฏ๋ก ๋ ์ด์ ๋ด๋ณด๋ผ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๊ฒ์ ์ค์ ๋ก 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์ ์ถ์ํ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์: ์ค๋ฅ ์์ ๊ธฐ์ ์ค๋ฅ๋ฅผ ๋ฒ๋ธ๋งํฉ๋๋ค.