TIL

24/02/04 TIL __ socket io에 redis어뎁터 추가

GABOJOK 2024. 2. 4. 23:42

소켓 통신에서 분리된 소켓 서버에서도 잘 작동할 수 있도록 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