내가 RabbitMQ를 사용하고자 하는 이유
프로젝트에서 알림의 기능을 구현하고자 했다.
특정 시간마다 스케줄링으로 여러명에게 알림을 보낼 생각이기 때문에 여러명에서 순차적으로 알림을 보내기 보다는 비동기방식으로 보내는 것이 좋다고 생각했다.
비동기 방식을 적용하려 생각했을 때 대표적으로 kafka와 rabbitMQ를 고려할 수 있었다.
간단하게 찾아본 결과
kafka는 대용량 메시지 전송과 실시간에 좀 더 적합하다고 이해를 했으며,
rabbitMQ는 좀 더 안정성이 있다고 이해를 했다.
프로젝트에서 예약 타임슬롯을 1시간 간격으로 설정하고자 했으며, 예약 10분전에 알림을 보내고, 매일 오전 9시에 다음날에 예약이 있는 경우 해당 예약의 리마인드 알림을 보내고자 했다.
때문에 10분전 알림인 경우 스케줄링을 매일 n시 50분때 큐를 확인해서 현재 시간과 비교하여 예약시간이 10분 후 인 예약 알림을 처리하도록 하려 했다.
하루전 알림인 경우 스케줄링 매일 오전 9시에 큐를 확인해서 현재날짜의 다음날이 예약인 경우 예약 알림을 처리하도록 했다.
타임 슬롯을 1시간단위로 만들 수 있도록 설계할 것이기 때문에 실시간이 필요없다고 생각되어 rabbitMQ를 생각했다.
오늘은 간단하게 적용해 보려 한다.
RabbitMQ 사용하기
1. 도커에 RabbitMQ를 설치하자
- 실행하기 예시들
docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 rabbitmq:3-management
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
docker run -d --hostname my-rabbit --name some-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3-management
docker ps
- -d: Docker 컨테이너를 백그라운드(데몬) 모드로 실행하는 옵션이다. 이 옵션을 사용하면 컨테이너가 백그라운드에서 실행되며, 현재 터미널 세션에서 다른 작업을 수행할 수 있다. 때문에 해당 터미널 창에서는 컨테이너의 출력을 볼 수 없다. 주로 백그라운드에서 지속적으로 실행되어야 하는 서비스를 실행할 때 이 옵션을 사용한다.
- -it: 대화형 모드로 컨테이너를 실행한다. 이 옵션은 컨테이너가 백그라운드에서 실행되지 않고 터미널과 상호작용할 수 있도록 한다.
- --rm: 컨테이너가 종료되면 자동으로 삭제된다.
- --name rabbitmq: 컨테이너의 이름을 "rabbitmq"로 설정한다.
- -p 5672:5672: 호스트의 5672 포트를 RabbitMQ 컨테이너의 5672 포트로 포워딩한다.
- -p 15672:15672: 호스트의 15672 포트를 RabbitMQ 컨테이너의 15672 포트로 포워딩하여 RabbitMQ 관리자 콘솔에 액세스할 수 있도록 한다. RabbitMQ 서버와 관리자 콘솔 모두에 액세스할 수 있도록 한다.
- rabbitmq:3-management: RabbitMQ 3 버전을 사용하며 관리자 콘솔이 있는 이미지를 가져와 컨테이너를 실행한다.
라고한다.
2. http://localhost:15672 접속한다.
기본 id, password는 guest다.
3. 큐를 생성하자
큐가 생성되었으면 생성된 큐를 클릭한다.
publish message: 큐에 메시지 발행
get message: 큐에서 메시지 빼기
requeue를 true로 할지 false로 할지
true면 뽑아낸 메시지가 그자리로 다시 들어감
큐가 잘안동작할 때 메시지가 지금 어떤게 들어가 있는지 뭐가 들어있길래 에러가 나는지 확인
false는 빼낸다.
연결 설정을 해주고
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
service - rabbitListener을 만들었다.
package com.zb.deuggeun.rabbitmq;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;
@Service
public class RabbitConsumer {
@RabbitListener(queues = "FRE_TEST")
public void receiveMessage(final String message) {
System.out.println(message);
}
}
@RabbitListener 어노테이션은 Spring에서 RabbitMQ 메시지를 수신하기 위한 메서드를 지정하는 데 사용된다.
이 어노테이션을 사용하면 해당 메서드가 지정된 RabbitMQ 큐에서 메시지를 수신하고 처리할 수 있다.
일반적으로 다음과 같은 상황에서 @RabbitListener 어노테이션을 사용할 수 있다.
- RabbitMQ 메시지를 수신하고 해당 메시지에 대한 처리를 수행해야 할 때.
- Spring Boot 애플리케이션에서 RabbitMQ 메시지를 구독하고자 할 때.
- RabbitMQ 큐에서 발생하는 이벤트에 반응하여 특정 동작을 수행해야 할 때.
예를 들어, 주문이 생성될 때마다 해당 주문을 처리하기 위해 주문을 수신하는 메서드를 작성할 수 있다. 또는 시스템의 다른 부분에서 발생하는 이벤트에 반응하여 특정 작업을 수행하기 위해 해당 이벤트를 수신하는 메서드를 작성할 수도 있다. 이러한 경우에 @RabbitListener 어노테이션을 사용하여 RabbitMQ 큐에서 메시지를 수신하고 해당 메시지를 처리할 수 있다.
'devops > docker' 카테고리의 다른 글
[Docker][Mysql] 데이터베이스 생성, 유저추가, 유저 권한 부여 (0) | 2024.04.29 |
---|