문제
docker-compose로 로컬에서 한번에 띄우고 있는데 위같은 에러가 떴다.
서버가 띄워졌는데, app(express.js 로 이루어짐) 서버가 띄워지는데까지 너무 오래걸려서 redis 서버가 기다리다가 connection timeout을 내뱉은 것이다.
해결방법 1
import * as redis from 'redis';
const redisClient = redis.createClient({
legacyMode: true,
username: selectedConfig.username,
password: selectedConfig.password,
socket: {
host: selectedConfig.host,
port: selectedConfig.port,
connectTimeout: 50000,
},
});
redisClient.on('connect', () => {
console.info('Redis connected!');
});
redisClient.on('error', (err) => {
console.error('Redis Client Error', err);
redisCli.quit();
});
redisClient.connect().then();
const redisCli = redisClient.v4;
export default redisCli;
그래서 구글링으로 connectionTimeout을 50초까지로 설정했다.
그랬더니 정상적으로 app, redis가 연결되었다.
근데, 실질적인 해결방법이라고 보기는 어려워보였다.
위 사람들은 비동기 호출을 사용하여 Redis 클라이언트가 연결되기를 기다리므로 경쟁 조건 문제가 발생하지 않게 했다는데,
나도 이미 connect().then()으로 호출하도록 작성해서 위 문제는 아니였다.
해결방법 2
npm install ioredis
ioredis는 연결 시간 초과 오류를 숨기고 백그라운드에서 연결을 다시 시도한다고 한다.
이를 통해 개발자는 명시적으로 연결 시간 초과 오류를 처리할 필요 없이 간단하게 라이브러리를 사용할 수 있게 된다.
해결방법 2가지
1. 패키지 redis -> ioredis 로 바꾸기
2. connectionTimeout 길게 지정하기
로 가볍게 해결해볼 수 있겠다.
참고
'JaveScript > ExpressJS' 카테고리의 다른 글
typeorm save -> insert 메서드로 변경 (0) | 2024.04.17 |
---|---|
APM tool을 Expressjs에 연동하기 (0) | 2024.04.10 |
async/await 를 Promise.allSetted로 리팩토링하기 (0) | 2024.03.31 |
유효성검사 중복코드 리팩토링하기 (0) | 2024.03.26 |
if-else => switch-case 리팩토링 (0) | 2024.03.25 |