Skip to content

[BE] RabbitMQ 클라이언트 추상화 레이어 구현 #477

@CodeVac513

Description

@CodeVac513

이슈 요약

node 진영에는 amqplib이라는 rabbitmq를 코드 레벨에서 연결할 수 있는 저수준 라이브러리가 있습니다.
실제로 Nest.js의 microservices에서 이 라이브러리를 래핑하여 RabbitMQ를 지원하기도 합니다.

amqplib를 직접 사용하여 코드를 만들면 RabbitMQ에 대한 코드가 비즈니스 로직 클래스 사이에 파편화됩니다.
예를 들어 EmailService 내부에서 channel(일종의 mysql 커넥션이라 생각하셔도 무방합니다.)을 호출하며 큐와 바인딩하는 코드 등이 섞일 수 있습니다.

이런 문제를 방지하기 위해서, amqplib을 RabbitMQService라는 클래스를 활용하여 직관적으로 사용할 수 있도록 래핑할 예정입니다.
이전에도 Redis에서 비슷한 작업을 했습니다만, 현재는 exchange나 queue가 있는지 생성하고 서로 바인딩하는 등의 설정에 대한 로직도 추가해야 합니다.

앞으로 방향은 다음과 같습니다.

  1. Config 파일을 두어 필요한 연결을 생성하고 channel을 가져와서 새로운 exchange나 queue를 생성하고 바인딩하는 등의 로직을 위임한다.
sequenceDiagram
   autonumber
   participant Config as RabbitMQConfig
   participant Broker as RabbitMQ
   
   rect rgb(225, 245, 254)
   Note over Config,Broker: 초기 연결 설정
   Config->>+Broker: Connection 생성 요청
   Broker-->>-Config: Connection 객체 반환
   Config->>+Broker: Channel 생성 요청
   Broker-->>-Config: Channel 객체 반환
   end
   
   rect rgb(255, 243, 224)
   Note over Config,Broker: Exchange & Queue 구성
   Config->>+Broker: Exchange 생성<br/>(type: direct/topic/fanout)
   Broker-->>-Config: ✅ Exchange 준비 완료
   Config->>+Broker: Queue 생성<br/>(durable: true)
   Broker-->>-Config: ✅ Queue 준비 완료
   end
   
   rect rgb(232, 245, 233)
   Note over Config,Broker: 바인딩 완료
   Config->>+Broker: Queue ↔ Exchange 바인딩<br/>(routing key 설정)
   Broker-->>-Config: ✅ 바인딩 성공
   Note over Config: 설정 완료
   end
Loading
  1. Service 파일을 두어 queue 이름만 가지고 있다면 직관적으로 메시지를 생성하고 소비할 수 있도록 한다.(Spring에서 Template 이라고 부르는 라이브러리와 비슷한 역할이라 생각하면 될 것 같습니다.)

하위 태스크

  • WAS
    • RabbitMQ Config 파일 생성
    • RabbitMQ Service 파일 생성
  • Feed-Crawler
    • RabbitMQ Config 파일 생성
    • RabbitMQ Service 파일 생성

인수조건

  • 정상적으로 RabbitMQ가 가동된다.
  • RabbitMQ에 설정한 Exchange와 Queue가 생성된다.
  • producer는 Exchange에 메시지를 발행하면 적절한 Queue에 메시지가 적재된다.
  • consumer는 Queue에 발행된 메시지를 적절하게 처리한다.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions