라벨이 socketio인 게시물 표시

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

 이제 본격적으로 Cluster를 이용한 채팅앱 서버를 만들도록 하겠습니다. 처음 이글을 보시는 분들은 이전글을 참고해 주시기 바랍니다. 링크 : NestJS Redis Pub/Sub과 Cluster로 SocketIO 채팅 앱 만들기 -1 제 컴퓨터는 12개의 코어를 갖고 있기 때문에 12개의 Workers를 만듭니다. 먼저 src경로에 'app-cluster.service.ts'를 만들어 줍니다. // src/app-cluster.service.ts import { Injectable } from '@nestjs/common' ; import * as os from 'os' ; const cluster = require ( 'cluster' ); // nodejs의 cluster를 사용 const numCPUs = os . cpus (). length ; // 현재 os의 cpu갯수 확인 @ Injectable () export class AppClusterService { static clusterize ( callback : Function ): void { console . log ( '총 cpu갯수 : ' , numCPUs ); if ( cluster . isMaster ) { console . log ( `Master server started on ${ process . pid } ` ); for ( let i = 0 ; i < numCPUs ; i ++) { cluster . fork (); } cluster . on ( 'exit' , ( worker , code , signal ) => { // 워커가 죽을시 console . log ( `Worker ${ worker . process . pi...

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 한 데이터를 알수있습니다. 이전...

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

이미지
 안녕하세요. 이번에는 NestJS와 Redis의 Pub/Sub기능을 이용하여 채팅 채널을 만들도록 하겠습니다. 채팅 채널을 테스트히기 위한 툴로는 Postman을 사용할 것이며 자세한 내용은 아래 링크를 참고해 주시기 바랍니다. 링크 : Postman 소켓IO 테스트하기 그리고 이전글을 참고하실려면 아래 링크를 확인해 주시기 바랍니다. 링크 : NestJS Redis Pub/Sub과 socketIO로 채팅 앱 백엔드 만들기 -0 일단 현재 블로그에서 작성하는 Node버전은 16.17.0이며 NestJS버전은 9.1.2입니다. 프로젝트를 생성(위 블로그에서는 nestjs-microservice-example)하고 필요한 npm모듈을 설치합니다. socketIO모듈을 설치할때는 아래 링크를 참고해 주시기 바랍니다. 링크 : NestJS SocketIO - 방을 선택해서 들어가는 채팅방 만들기 위 사항이 마무리 되면 microservice 모듈을 설치합니다. - @nestjs/microservices npm 설치 $ npm i --save @nestjs/microservices copy - redis바탕으로 microservices를 구상할때 설치 $ npm i --save ioredis copy 먼저 최상단 루트에 .development.env파일을 만들어주고 아래와 같이 작성합니다. NESTJS_PORT=4500 REDIS_PORT=6379 REDIS_HOST="localhost" NestJS_PORT가 4500이지만 추가로 실행할 서버는 포트번호를 다르가 하면서 추가하시면 됩니다. 사진1) 백엔드 구성 사진1은 개발할려는 기본적인 백엔드 구조 입니다. 모듈안에는 컨트롤러와 웹소켓 서버(socketio.gateway)가 있는데 기본적으로 웹소켓이 채팅앱입니다.  다만 Redis에서 데이터를 Subscribe는 socket_publish에서 받고나서 socketio.ga...

NestJS Redis Pub/Sub과 socketIO로 채팅 앱 백엔드 만들기 -0

이미지
 안녕하세요 알렉스 입니다. 이번에는 채팅앱 백엔드를 만들면서 백엔드를 구현하도록 하겠습니다. 백엔드를 NodeJS로 구현을 할때 문제점은 NodeJS가 싱글스레드라는 것입니다. 이는 아래 링크를 참고해 주시기바랍니다. 링크 : Node JS의 싱글스레드 -1 쉽게 말해서 CPU가 한번에 한가지 일만 한다는 것입니다. 물론 NodeJS가 빠르기는 하지만 한번에 많은 부하가 가해지면 서버가 다운될 위험이 있습니다.  사진1) 서버 한개로 채팅앱 구현  만약 서버 하나로만 채팅앱을 구현할때 단일 서버 또는 SocketIO로 많은 부하가 가해질수 있고 이로 인해서 서버가 다운 될수가 있습니다. 사진2) 채팅앱 백엔드 구조 이를 위해 Redis의 Pub/Sub기능을 이용하여 채팅앱을 분산(or MicroService)하여 개발할 것입니다. 사진2의 NestJS-1, NestJS-2, NestJS-3은 코드는 같지만 각각 다른 서버 또는 포트에서 동작하고 있는 프로그램 입니다. 각각의 서버는 SocketIO서버를 통해서 유저들과 통신을 하게 됩니다. 이때 user1이 작성한 내용은 Redis에 Publish되고 NestJS2, 3에 Subscribe되서 해당되는 유저들도 데이터를 전달 받습니다. 즉 각 서버는 분리되어있지만 Redis의 Pub/Sub기능으로 인해 데이터를 즉각적으로 공유할수 있습니다. 물론 NodeJS은 싱글 스레드이지만 여러개의 스레드를 동시에 사용할수 있습니다. 그러면 1개의 서버를 사용해도 부담이 적죠. 하지만 그것에 대한 내용은 나중에 작성하도록 하겠습니다. 이번 시리즈는 싱글스레드 NestJS을 이용해서 분산 채팅앱을 만드는것에 집중하도록 하겠습니다. 다음글 : NestJS Redis Pub/Sub과 socketIO로 채팅 앱 만들기 -1 

Postman 소켓IO 테스트하기

이미지
 안녕하세요. 알렉스입니다. 이번에 postman에서 소켓IO를 테스트 할수 있는 기능을 추가했습니다. 하지만 이 기능은 베타(2022.07.04기준)이기 때문에 버그나 기능을 수정하고 있습니다.  소켓IO를 테스트 하기 위한 서버는 아래 링크를 참고해 주시기바랍니다. 해당 서버를 Postman 소켓IO테스트에 사용할 예정입니다. 링크 : NestJS SocketIO - 방을 선택해서 들어가는 채팅방 만들기 사진1) Postman 메인 사진2) 새로운 Tab생성 사진3) New Tab 선택창(WebSocket Request 선택) 사진4) Socket.IO 선택 사진5) 소켓서버 실행 사진5) 소켓주소 입력후 Connect클릭 사진6) SocketIO입력 방법은 JSON타입 선택 사진7) 전송할 JSON데이터 및 Listenting할 방을 작성 사진8) join을 subscribe하여 방을 생성한다. 사진8에서 'join'뿐만 아니라 참여할려는 방도 갖이 Listeners을 해야 합니다. 여기서는 'num1'입니다. 사진9) 서버에서 유저가 참여후 Broad Cast 사진10) 유저 Alex가 채팅 작성 사진11) 같은방 유저도 갖이 메세지 확인 Postman socketIO는 현재 베타버전이기 때문에 동작이 제대로 안되는 경우가 있습니다. 이때 Postman을 재시작 하거나 PC를 재시작 하는 것을 추천 드립니다.