본문 바로가기

개발/개발의 ㄱ

[NestJs] microservice RabbitMQ 적용 - (개념)

반응형

NestJs에서  RabbitMQ를 적용한 레퍼런스가 많지 않습니다.

이전에 MSA(MicroService Architecture)를 구축했었기에, 금방할거라 생각했지만 꽤 걸렸네요.

두 글에 걸쳐서 적용하는 과정을 공유하려 합니다

 


NestJs는 microservice 기능을 제공한다. http단계를 넘어 transport단계까지 아우를수 있다고 한다. 

*transport 수단으로 RabbitMQ를 사용한다 이해하면 좋다

https://docs.nestjs.com/microservices/basics

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

 

보통 프레임워크에서 제공하는 부가기능은 그냥 가져다 쓰면 됐다.  코드로 밟아야할 절차를 제공해 클론코딩이 가능했고, 용어들에 혼선이 와도 일단 가능했다. 

문제는 NestJs-RabbitMQ는 그렇지 않다는거....

* NestJs의 RMQ는 nodJs의 RMQ에서 message emit시 필수가 아닌 pattern이 필수다.

여러번의 시도 끝에 아래와 같은 구조가 잡혔다.

 

0. hybrid application

웹 서버가 아닌 서비스 서버면 microservice기능을 그대로 쓰면 된다.

그러나 웹 서버에서 서비스 서버로 메세지 큐를 날리고 싶었고, 어떡하지 찰나에 문서 구석에 아래 정보가 있었다.

*여기서 웹서버는 동적 웹서버 express로 이해하시는게 좋을듯합니다

 

https://docs.nestjs.com/faq/hybrid-application#hybrid-application

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

 

1. main.ts에서 microservice start

const app = await NestFactory.create(AppModule);
//추가된 코드
const microservice = app.connectMicroservice<MicroserviceOptions>({
  transport: Transport.TCP,
});
//추가된 코드
await app.startAllMicroservices();
await app.listen(3001);

기존 http서버 띄우는 코드에서 두줄이 추가가 됐다. 연결할 microservice를 설정한후, startAllMicroservices를 실행한다

 

2. module에서 import

// module import
@Module({
  imports: [
    ClientsModule.register([
      { name: 'MATH_SERVICE', transport: Transport.TCP },
    ]),
  ]
  ...
})

사용할 transport(TCP, RMQ...)와 name을 설정후 등록한다.

 

3. Inject(name)으로 접근

// constructor내에서 선언
@Inject("name") private rmqClient: ClientProxy

controller or service에서 사용하려면, 모듈 Import시 설정한 name으로 Inject하면 된다.

 

 

대략적인 흐름을 다뤘다. 다음 글에서 실제 코드를 다룰것이다.

 

 

 

 

*코드가 깨지면 아래 링크를 참조해주세요

https://medium.com/%EB%8F%84%EA%B9%A8%EB%B9%84-%EC%9D%B4%EC%95%BC%EA%B8%B0/nestjs-microservice-rabbitmq-%EC%A0%81%EC%9A%A9-%EA%B0%9C%EB%85%90-4cc326397b3b