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.pid} died. Restarting`);
cluster.fork(); // 워커 재시작
});
} else {
console.log(`Cluster server started on ${process.pid}`);
callback();
}
}
}


이후 main.ts파일에 해당 서비스를 적용해 줍니다.

// src/main.ts
import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import { AppClusterService } from './app-cluster.service';
import { AppModule } from './app.module';

async function bootstrap() {
const app = await NestFactory.create(AppModule);

// Redis MicroService 연결(PubSub/Sub기능 구현)
app.connectMicroservice<MicroserviceOptions>({
transport: Transport.REDIS, // transport유형 : 여기서는 Redis로 한다.
options: {
port: +process.env.REDIS_PORT, // Redis port 지정. 보통 redis서버는 포트가 6379이다
host: process.env.REDIS_HOST, // redis 경로
password: process.env.REDIS_PASSWORD || null, // redis 비밀번호(필요시)
},
});

app.enableCors();

app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
forbidNonWhitelisted: true,
transform: true,
transformOptions: {
enableImplicitConversion: true,
},
}),
);

const options = new DocumentBuilder()
.setTitle('NestJS-MicroService-UseRedisPub/Sub-Example AND Cluster')
.setVersion('1.0')
.addBearerAuth()
.build();

// Swagger Document의 문서를 api(/api-docs)로 설정할수 있게 셋팅
const document = SwaggerModule.createDocument(app, options);
SwaggerModule.setup('api-docs', app, document);
await app.startAllMicroservices(); // 마이크로서비스 활성화
await app.listen(+process.env.NESTJS_PORT);
console.log('REDIS PORT : ', process.env.REDIS_PORT);
console.log('REDIS HOST : ', process.env.REDIS_HOST);
console.log('NestJS Port : ', process.env.NESTJS_PORT);
}
// bootstrap();
AppClusterService.clusterize(bootstrap); // 멀티스레드 사용시(각각의 코어)


위상태에서 실행을 하고 test 패턴으로 publish하게 되면 해당 redis를 subscribe하는 모든 개체에 대해서 데이터를 보내게 됩니다.


gitHub링크 : https://github.com/Alex-Choi0/nestjs-microserviceAnd-cluster-example.git

댓글

이 블로그의 인기 게시물

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

DAQ로 전압 측정하기-2

Lesson 12_2 참조를 이용한 프로퍼티노드(Property Node)