NestJS Redis Pub/Sub과 Cluster로 SocketIO 채팅 앱 만들기 -1

 채팅앱을 만드는 법은 이전글에도 설명을 했지만 멀티 Cluster를 사용하여 채팅앱의 효율을 극대화 하기 위해서 글을 작성합니다. 위 블로그는 이전에 작성한 채팅앱을 기준으로 프로그래밍을 합니다. 해당 자료는 아래 링크를 참고해 주시기 바랍니다.


링크0 : NestJS Redis Pub/Sub과 socketIO로 채팅 앱 만들기 -0

링크1 : NestJS Redis Pub/Sub과 socketIO로 채팅 앱 만들기 -1

링크2 : NestJS Cluster를 이용하여 CPU최대로 활용하기


사진1) 개선된 채팅앱 백엔드 구조도



 사진1을 확인할때 이전 채팅앱과 다른점은 서버가 1개 이상이라는 것입니다. 서버안에 Worker가 있는데 이것은 PID가 다른 NestJS프로그램입니다. 해당 서버의 CPU코어수에 따라 Worker를 생성할수 있으며 각각의 워커는 채팅앱 백엔드를 구성합니다.


 만약 PubSub기능을 사용하지 않고 그대로 한다면 문제점이 생깁니다. 


사진2) PubSub을 사용하지 않을시 문제점

사진2에서 SocketIO 1을 통해서 데이터가 Worker 1으로 전송이 되면 서버를 통해서 Redis에 저장도비니다. 그러면 Server1의 Worker1만 제외하고 나머지 Worker는 Redis의 데이터를 읽기전까지 데이터가 변경 된것을 모르게 됩니다.


사진3) PubSub을 적용후 데이터 흐름


사진2와 달리 사진3은 PubSub기능을 적용한 데이터 흐름도 입니다. SocketIO 1이 Worker1을 통해 Redis에 Publish합니다. 그러면 Redis는 이 데이터를 해당 채널에 SubScribe하는 Worker에 전달합니다. 필요시 Publish한 서버에도 전송합니다. 사진3에서 SubScribe 서버는 Server1과 Server2입니다. 즉 Server에 연결된 모든 Worker가 SocketIO1(Server1)의 Publish 한 데이터를 알수있습니다.


이전에 작성한 채팅앱 프로그램으로 Cluster까지 적용하도록 하겠습니다.



댓글

이 블로그의 인기 게시물

Lesson 12_1 프로퍼티 노드(Property Node)

DAQ로 전압 측정하기-2

Nest JS URL에 있는 쿼리(Query) 읽기