본문 바로가기
해피 코딩/Spring

RabbitMQ 실습하기

by happy-coding 2024. 8. 16.
🔥 공부했던 이론을 바탕으로 프로젝트 실습을 진행해 보자!

 

  • RabbitMQ 이론 정리

😺 Blog: https://happy-coding.tistory.com/24


[ RabbitMQ 실행 확인 ]

  • 도커에서 RabbitMQ 설치
docker run -d --name rabbitmq -p5672:5672 -p 15672:15672 --restart=unless-stopped rabbitmq:management

 

  • 도커에서 RabbitMQ 실행 확인

입력한 15672가 관리자 화면이다

 

  • localhost:15672에 접속
    • RabbitMQ 로그인 페이지
    • Username및 Password에 guest/guest를 입력하여 접속하면 대시보드를 볼 수 있습니다.

RabbitMQ 로그인 페이지, 대시보드


[ RabbitMQ 실습 ]

RabbitMQ 실습 설계도


[ OrderApplication ]

  • order Producer 설정
Dependencies

starter

application.properties
spring.application.name=order

# exchange, queue 이름 지정
message.exchange=market
message.queue.product=market.product
message.queue.payment=market.payment

# RabbitMQ 관련 설정
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
QueueConfig
@Configuration
public class OrderApplicationQueueConfig {

  @Value("${message.exchange}")
  private String exchange;

  @Value("${message.queue.product}")
  private String queueProduct;

  @Value("${message.queue.payment}")
  private String queuePayment;

  // exchange 생성
  @Bean public TopicExchange exchange() { return new TopicExchange(exchange); }

  // queue.product 생성
  @Bean public Queue queueProduct() { return new Queue(queueProduct); }

  // queue.payment 생성
  @Bean public Queue queuePayment() { return new Queue(queuePayment); }

  // binding: exchange 에서 queue 로 이동하는 통로 / 큐와 바인딩의 이름(라우팅 키)을 일치시켜서 헷갈리지 않게 하자!
  @Bean public Binding bindingProduct() { return BindingBuilder.bind(queueProduct()).to(exchange()).with(queueProduct); }
  @Bean public Binding bindingPayment() { return BindingBuilder.bind(queuePayment()).to(exchange()).with(queuePayment); }
}
  • exchange 생성
  • market.product 큐 생성
  • market.payment 큐 생성
  • exchange, Queue 바인딩 설정
OrderService
// RabbitTemplate: RabbitMQ로 요청을 보낼 때 사용
private final RabbitTemplate rabbitTemplate;

public void createOrder(String orderId) {
  // marker.product 큐로 orderId 전송
  rabbitTemplate.convertAndSend(productQueue, orderId);
  // marker.payment 큐로 orderId 전송
  rabbitTemplate.convertAndSend(paymentQueue, orderId);

[ 실행 결과 ]

  • order/1로 요청 보내기 (2번)
  • http://localhost:15672로 접속하여 RabbitMQ의 생성된 Exchange와 Queue 를 확인
  • market.payment 를 클릭해서 세부정부 보기
exchange 생성

market exchage 생성

Queue 생성

  • Total, Ready에 메시지가 2개가 있는 모습을 볼 수 있다.
  • 아직 Consumer를 생성 및 연결하지 않아 Queue에 데이터가 쌓여있는 모습을 볼 수 있다.
세부 정보
  • market.payment 를 클릭해서 세부정부 보기

연결된 exchange의 이름과 binding의 이름을 볼 수 있다

 

Get Messages의 Payload를 통해 Queue에 들어있는 데이터를 볼 수 있다


[ PaymentApplication ]

  • payment Consumer 설정
Dependencies

starter

application.properties
  •  payment Consumer에서는 본인에게 해당하는 Queue의 이름만 알고 있으면 됩니다.
spring.application.name=payment

# payment Consumer 에서는 본인에게 해당하는 Queue의 이름만 알고 있으면 된다
message.queue.payment=market.payment

# RabbitMQ 관련 설정
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
PaymentEndpoint
@Value("${spring.application.name}")
public String appName;

// RabbitMQ에서 메시지를 수신하기 위해 사용하는 기능 / 지정된 큐로부터 메시지를 받아 처리
@RabbitListener(queues = "${message.queue.payment}")
public void receiveMessage(String orderId){ // 큐로부터 orderId 값을 받는다
  log.info("receive OrderId: {}, appName: {}", orderId, appName);
}

[ 실행 결과 ]

  1. PaymentApplication Run
  2. 터미널 로그 확인
  3. http://localhost:15672 접속 후 Queue 확인
터미널 로그 확인

Queue에 쌓여있던 메시지 2개를 가져오는 모습을 볼 수 있다

http://localhost:15672 접속 후 Queue 확인

payment Consumer가 Queue에 쌓여있던 메시지를 처리한 것을 볼 수 있다


[ ProductApplication ]

  1. OrderApplication과 같은 방식으로 코드를 생성
  2. ProductApplication을 복사하여 라운드로빈 방식을 이용
  3. /order/1 ~ /order/6까지 요청하여 라운드로빈 방식으로 큐의 메시지를 받아오는지 확인
ProductApplication을 복사

ProductApplication을 복사

/order/1 ~ /order/6까지 요청하여 라운드로빈 방식으로 큐의 메시지를 받아오는지 확인


[ 정리 ]

RabbitMQ 실습 설계도

 

order(Producer)에서 exchange, binding, queue를 설정해 주고, Consumer에서 본인에게 해당하는 큐를 연결하여 Queue에 들어있는 메시지 데이터를 받아와  Log를 통하여 확인해 보았다.

추가로 Product(Consumer)는 큐에 들어있는 메시지를 라운드로빈 방식을 통하여 가져오는 것을 로그을 통하여 확인해 보았다. 

역시 이론만 공부하기보다는 실습을 통하여 직접 사용해 봐야지, 해당 기술에 대해 감이 더 잘 잡히는 것 같다.

개인적으로 RabbitMQ는 다른 기술에 비해서 상당히 재미있게 실습한 것 같다.

 

읽어주셔서 감사합니다 😊

 

😺 GitHub: https://github.com/mad-cost/Sparta-RabbitMQ-study