소켓 통신에서 분리된 소켓 서버에서도 잘 작동할 수 있도록 adapter를 연결했다.
처음에 대용량 트래픽 시나리오를 기반으로 시작했기 때문에 추후 분산될 소켓 서버를 생각하면 adapter를 사용하는게 맞다고 느껴졌다.
pub/sub모델을 아직 사용하진 않지만, 공식문서에 안내된 대로 따라가서 이런 상태이다.
추후 kafka를 사용할 계획이고, pub/sub 부분을 어떻게 만져야 할지는 좀더 봐야할 것 같다.
kafka라는게 있다는 것도 얼마 전에 알았기 때문에 공부가 많이 필요하다.
adapter는 redis로만 사용해야 하는건 아니다. 공식문서를 잘 찾아보면, 다른 방법도 지원을 하고 있다.
추가로 redis의 pub/sub과 함께 사용했을때 그것을 구현하는 로직과 연관되어 성능상 이슈가 있었다는 기술블로그를 봤는데,
만약 redis의 pub/sub으로 진행할거라면 이부분을 고려하면 좋을 것 같다.
import { IoAdapter } from '@nestjs/platform-socket.io';
import { ServerOptions } from 'socket.io';
import { createAdapter } from '@socket.io/redis-adapter';
import { createClient } from 'redis';
import { ConfigService } from '@nestjs/config';
import { Logger } from '@nestjs/common';
export class RedisIoAdapter extends IoAdapter {
private adapterConstructor: ReturnType<typeof createAdapter>;
async connectToRedis(configService: ConfigService): Promise<void> {
const pubClient = createClient({
password: configService.get<string>('REDIS_PASSWORD'), //테스트
socket: {
host: configService.get<string>('REDIS_HOST'),
port: configService.get<number>('REDIS_PORT'),
},
});
//publish 클라이언트의 복제본 생성해 구독 클라이언트 만들며 초기화
const subClient = pubClient.duplicate();
const connect = await Promise.all([pubClient.connect(), subClient.connect()]).catch((err) => Logger.log('adapter 에러 확인 로그', err));
Logger.log('connect', connect);
this.adapterConstructor = createAdapter(pubClient, subClient);
}
//socket io서버 인스턴스 생성. __이 메서드는 NestJS 프레임워크에 의해 내부적으로 호출되며, 개발자가 직접 호출할 필요는 없습니다.
createIOServer(port: number, options?: ServerOptions): any {
const server = super.createIOServer(port, options);
//생성된 서버 인스턴스에 레디스 어뎁터 적용.
server.adapter(this.adapterConstructor);
return server;
}
}
테스트를 하는 방법은 간단하다.
환경변수에 port 를 다르게 해서 테스트 가능하다.
PORT=3003 npm run start
'TIL' 카테고리의 다른 글
24/02/07 TIL __ 레플리케이션 (0) | 2024.02.07 |
---|---|
24/02/06 TIL __ 메세지 브로커 와 소켓 어뎁터 (1) | 2024.02.06 |
24/02/03 TIL __ socket io와 TCP 통신 (0) | 2024.02.03 |
24/02/02 TIL __ 레플리케이션 과 클러스터 그리고 샤딩 (0) | 2024.02.02 |
24/02/01 TIL __ rtmp 프로토콜, hls 프로토콜을 이용한 스트리밍 서비스 (0) | 2024.02.01 |