pm2 cluster 사용 시 node간의 통신(상태 동기화)

 

목표

Node-Es 서버를 pm2 cluster 모드로 실행시켜 여러 개의 노드를 실행시키고 있는 상황에서

특정 노드의 상태가 변할시 다른 노드에게 상태를 전이시키는 게(알림) 목표입니다.

 


방법

같은 서버에서 동작하며 pm2라는 부모 프로세스에 같이 묶여 있으므로

ipc를 이용하여 동기화가 필요한 Node들에게 상태를 알리려고 합니다.

 

pm2 cluster로 실행시 node의 process.send를 통해 다른 Node들에게 보내려고 하였는데,

메시지를 보내면 다른 노드들에게 가는 게 아니라 pm2에게 전달되었습니다.

 

https://engineering.linecorp.com/ko/blog/pm2-nodejs

 

PM2를 활용한 Node.js 무중단 서비스하기

2022-LINE-engineering-site

engineering.linecorp.com

위 포스트처럼 무중단을 작성하였는데 wait을 위해 메시지를 받기 위해 그런 것 같습니다.

 

다른 방법으로 노드들의 pid를 알아내어 signal을 보내려고 하였는데 pid 찾는 것도 일이고, 어떤 signal을 보낼지 고민이 되어

pm2에서 제공하는 api를 사용하기로 했습니다.

 

pm2에서 제공되는 api를 이용하여 각 노드들에게 메시지를 전달합니다.

 

설치 명령어는 아래와 같습니다.

 

// pm2
npm -i pm2

// yarn
yarn add pm2

 

api 링크: https://pm2.keymetrics.io/docs/usage/pm2-api/

 

PM2 - PM2 API

Advanced process manager for production Node.js applications. Load balancer, logs facility, startup script, micro service management, at a glance.

pm2.keymetrics.io

 


구현

 

각 함수들을 promise를 반환하게 변환하였습니다.

 

1. pm2 모듈을 사용하여 현재 돌아가고 있는 instance들의 목록을 가져옵니다.

pm2.list(err, callback)
Retrieve all processes managed with PM2

 

2. 인스턴스의 목록들 중에서 현재 변경이 된 instance와 같은 이름의 instance들에게만 보내도록 배열에 담아줍니다.

 

 

 

 

3. 배열에 담긴 인스턴스에게만 message를 발송합니다.

 

 

 

 

4. 동기화 메시지는 요청을 응답한 후 적용할 예정이므로 미들웨어에 등록하여 요청이 끝나면 호출되도록 하였습니다.

 

 

 

 

 

5. 발송된 메시지를 받기 위하여 main.ts에 process message 이벤트를 수신하는 함수를 작성하였습니다.

    해당 이벤트가 트리거 되었을 때  필요한 로직이 수행되도록 작성하였습니다.