RabbitMQ

haruceki·2024년 8월 16일

RabbitMQ

RabbitMQ 메시지 브로커로, 메시지 브로커는 데이터(메시지)를 송신자(프로듀서)로부터 수신자(컨슈머)에게 전달하는 중간 매개체 역할을 한다. 이때 RabbitMQ는 이러한 메시지를 큐(queue)에 저장하고 필요할 때 적절한 수신자에게 전달되도록 한다.
RabbitMQ의 특징으로는 비동기 처리, 부하 분산, 내결함성 등이 있다.

RabbitMQ 장단점

장점

  1. 확장성: RabbitMQ는 클러스터링 기능을 통해 확장성이 뛰어남. 메시지 큐의 부하가 증가할 때, 여러 노드로 확장 가능.
  2. 안정성: 메시지의 신뢰성을 보장하는 다양한 메커니즘(예: 메시지 영구 저장, ACK/NACK 기능)을 제공하므로 중요한 데이터를 안전하게 전달 가능
  3. 확장성: 클러스터링을 통해 여러 노드로 구성된 환경에서 높은 가용성과 부하 분산을 제공하며,페더레이션(federation) 및 셰어드 노딩(sharded nodes)을 통해 분산된 메시징 시스템 구축이 가능하다.
  4. 광범위한 커뮤니티: 오랜 기간 널리 사용되어 온 만큼, 많은 자료와 사례, 커뮤니티 지원을 받을 수 있다.
  5. 유연성(Flexibility): 여러 가지 메시지 전달 패턴(단일 소비자, 다중 소비자, 라운드 로빈, 팬아웃, 주제 기반 등)을 지원하며 다양한 방식으로 라우팅 가능
    7.프로토콜 지원: 기본적으로 AMQP(Advanced Message Queuing Protocol)를 사용하지만, STOMP, MQTT 등 다양한 프로토콜도 지원함.
  6. 관리 및 모니터링(Manageability and Monitoring): 웹 기반 관리 인터페이스를 통해 큐, 익스체인지, 바인딩 등을 쉽게 관리할 수 있고 다양한 플러그인 시스템을 사용 가능하다.
  7. 성능(Performance): 적절히 구성된 RabbitMQ는 높은 메시지 처리량을 제공하여 대규모 애플리케이션에서도 효과적으로 사용할 수 있습니다.

단점

  1. 복잡한 설정: RabbitMQ는 설치 및 초기 설정이 다소 복잡하다. 특히, 클러스터링이나 고급 기능을 사용시에.
  2. 비교적 높은 오버헤드: 메모리와 CPU 자원을 많이 소모. 작은 규모의 시스템에서는 과할 수도 있다.
  3. 운영 관리 비용: 클러스터 관리를 비롯한 운영 관리가 까다로울 수 있다. 운영 중 발생할 수 있는 문제를 해결하기 위해 일정한 수준의 관리가 필요.
  4. 기본적인 기능 제한: 일부 고급 기능(예: 메시지 지연, 분산 트랜잭션)은 기본적으로 지원되지 않거나 제한적으로 지원되므로 이런 기능이 필요하다면 별도의 추가 작업이 필요할 수 있다.
  5. 제한된 메시지 크기(Limited Message Size): RabbitMQ는 매우 큰 메시지 처리에 제한이 있을 수 있으며, 대용량 파일 전송에는 적합하지 않을 수 있다.
  6. 러닝 커브(Learning Curve): RabbitMQ의 개념과 설정을 이해하는 데 시간이 걸릴 수 있다.

RabbitMQ 기본 구성 요소

  • Producer (생산자)
    메시지를 생성해서 RabbitMQ로 보내는 역할

  • Queue (큐)
    RabbitMQ에서 메시지가 저장되는 공간

  • Consumer (소비자)
    큐에 쌓인 메시지를 꺼내 처리하는 역할

  • Exchange (교환기)
    Producer가 보낸 메시지를 어떤 큐로 보낼지 결정하는 역할. 즉, 메시지를 받아서 특정 큐로 라우팅해 주는 역할. 라우팅 방식에 따라 여러 종류의 Exchange가 있지만 주로 Direct Exchange를 사용한다

  • Binding (바인딩)
    Exchange와 Queue를 연결하는 다리 같은 역할. 바인딩을 통해 특정 Exchange에서 어떤 큐로 메시지가 보내질지 결정할 수 있다.

  • Routing Key (라우팅 키)
    메시지를 큐로 라우팅할 때 사용. Producer가 메시지를 보낼 때, 라우팅 키를 포함시킬 수 있고, Exchange는 이 라우팅 키를 기반으로 메시지를 특정 큐로 보낼지 결정한다.

AMQP(Advanced Message Queuing Protocol)

AMQP는 메시지 지향 미들웨어를 위한 개방형 표준 프로토콜로 메시지를 안전하고 신뢰성 있게 전달하기 위해 설계된 프로토콜이다. 주로 RabbitMQ 같은 메시지 브로커에서 사용된다.

RabbitMQ를 설치와 확인

도커를 통해 간단히 설치 가능하며

docker run -d --name rabbitmq -p5672:5672 -p 15672:15672 --restart=unless-stopped rabbitmq:management

localhost:15672 관리자 페이지에서 확인 가능하다.
(디폴트 아이디와 비밀번호는 guest/geust이다)

RabbitMQ 사용해보기

application.properties
message.exchange=market
message.queue.product=market.b

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
AApplicationQueueConfig
@Configuration
public class AApplicationQueueConfig {

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

    @Value("${message.queue.b}")
    private String queueB;

	//exchage 생성
    @Bean public TopicExchange exchange() { return new TopicExchange(exchange); }
    
    //큐 생성
    @Bean public Queue queueB() { return new Queue(queueB); }

	//바인딩 생성
    @Bean public Binding bindingB() { return BindingBuilder.bind(queueB()).to(exchange()).with(queueB); }
   
}
AController (producer)
private final RabbitTemplate rabbitTemplate;

rabbitTemplate.convertAndSend(queueB, msg); //큐에 메시지 전송
BEndpoint (consumer)
@Component
public class BEndpoint {

    @RabbitListener(queues = "${message.queue.b}") //큐를 바라보는 리스너
    public void receiveMessage(String msg) {
        log.info("receive msg :{}", msg);
    }
}
profile
희망도 절망도 없이 매일 코딩을 한다.

0개의 댓글