RabbitMQ 메시지 브로커로, 메시지 브로커는 데이터(메시지)를 송신자(프로듀서)로부터 수신자(컨슈머)에게 전달하는 중간 매개체 역할을 한다. 이때 RabbitMQ는 이러한 메시지를 큐(queue)에 저장하고 필요할 때 적절한 수신자에게 전달되도록 한다.
RabbitMQ의 특징으로는 비동기 처리, 부하 분산, 내결함성 등이 있다.
Producer (생산자)
메시지를 생성해서 RabbitMQ로 보내는 역할
Queue (큐)
RabbitMQ에서 메시지가 저장되는 공간
Consumer (소비자)
큐에 쌓인 메시지를 꺼내 처리하는 역할
Exchange (교환기)
Producer가 보낸 메시지를 어떤 큐로 보낼지 결정하는 역할. 즉, 메시지를 받아서 특정 큐로 라우팅해 주는 역할. 라우팅 방식에 따라 여러 종류의 Exchange가 있지만 주로 Direct Exchange를 사용한다
Binding (바인딩)
Exchange와 Queue를 연결하는 다리 같은 역할. 바인딩을 통해 특정 Exchange에서 어떤 큐로 메시지가 보내질지 결정할 수 있다.
Routing Key (라우팅 키)
메시지를 큐로 라우팅할 때 사용. Producer가 메시지를 보낼 때, 라우팅 키를 포함시킬 수 있고, Exchange는 이 라우팅 키를 기반으로 메시지를 특정 큐로 보낼지 결정한다.
AMQP는 메시지 지향 미들웨어를 위한 개방형 표준 프로토콜로 메시지를 안전하고 신뢰성 있게 전달하기 위해 설계된 프로토콜이다. 주로 RabbitMQ 같은 메시지 브로커에서 사용된다.
도커를 통해 간단히 설치 가능하며
docker run -d --name rabbitmq -p5672:5672 -p 15672:15672 --restart=unless-stopped rabbitmq:management
localhost:15672 관리자 페이지에서 확인 가능하다.
(디폴트 아이디와 비밀번호는 guest/geust이다)

message.exchange=market
message.queue.product=market.b
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
@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); }
}
private final RabbitTemplate rabbitTemplate;
rabbitTemplate.convertAndSend(queueB, msg); //큐에 메시지 전송
@Component
public class BEndpoint {
@RabbitListener(queues = "${message.queue.b}") //큐를 바라보는 리스너
public void receiveMessage(String msg) {
log.info("receive msg :{}", msg);
}
}