728x90

사건의 발단

db 를 주기적으로 조회해서 data 를 socket 으로 뿌려주는 서버가 db 와의 연결이 끊어지면서 에러를 내뱉으면서 서버가 죽어버렸습니다.

 

db 를 연결할때 Client로 연결 했던 문제도 있었고 연결이 끊겼을때 라던지 서버가 죽었을때 아무런 조치를 취하지 않았던 것이 문제였습니다.

 

recursive connection

import dotenv from 'dotenv';
import pg from 'pg';
import { logger } from '../logger/logger.js';
dotenv.config();

const pgConfig = {
  user: process.env.DB_USER_NAME,
  host: process.env.DB_HOST,
  database: process.env.DB_NAME,
  password: process.env.DB_USER_PASSWORD,
  port: +process.env.DB_PORT,
  ssl: { rejectUnauthorized: false },
};
let pool;
export function connect() {
  pool = new pg.Pool(pgConfig);
  pool.on('error', (error) => {
    logger.error('Failed to connect db ' + error);
    setTimeout(() => {}, 3000);
    connect();
  });
  return pool.connect();
}
connect();

export function connectionCheck() {
  pool.query('SELECT NOW()', (err, result) => {
    if (err) {
      logger.error('Error database connection', err.stack);
      connect();
      return null;
    } else {
      logger.info('Connect db status check: OK time: ' + result.rows[0].now);
      return null;
    }
  });
}

export default pool;

 

기존 코드를 수정했습니다. 연결이 실패하면 pool.on 에서 error 를 catch하여 3초 후 다시 자기자신을 호출합니다.

connectionCheck 를 만들어 주기적으로 db 와의 연결 상태를 체크합니다.

 

하지만 Server 가 죽으면 이마저도 무의미합니다. 

 

Docker로 항상 재시작하기

Dockerfile

FROM node:alpine

WORKDIR /usr/src/app

COPY ./package.json ./

EXPOSE 3060

RUN npm i -g npm &&\
    npm install &&\
    npm i -g pm2 node-gyp

COPY . .

CMD ["pm2-docker", "app.js"]

 

docker build & start

docker build -t restart_test .
docker run --restart=always -d -p 3060:3060 restart_test

 

restart=always 옵션으로 docker daemon이 계속해서 이 image를 run하게 만듭니다.

 

728x90

'Javascript > js - node.js' 카테고리의 다른 글

npm install 종속성 error 해결하기  (0) 2021.05.19