메시지 지향 미들웨어(Message-Oriented middleware) 라고도 함FIFO(First IN First Out) 방식으로 구현됨Advanced Message Queue Protocol메시지 브로커 와 이벤트 브로커로 나뉨Producer: 요청을 보내는 주체Exchange: Producer 로부터 메시지를 받아 Queue로 처리해주는 역할Queue: Consumer에 보내기 전 Exchange에서 수신 받은 메시지를 저장하는 저장소Consumer: 메시지를 소비하는 주체Binding: Exchange와 Queue의 연결을 나타냄(라우팅을 결정하는 과정)
AMQP로 구현된 오픈소스 메시지 브로커
| 타입 | 동작 방식 | Routing Key |
|---|---|---|
| Direct | 라우팅 키가 정확하게 일치하는 큐에 메시지 전달 (1:1) | sample.routing.key |
| Fanout | 바인딩된 모든 큐에 동일한 메시지 전달 (1:N) | 사용하지 않음 |
| Topic | 라우팅 키 패턴의 일치 여부에 따라 메시지 라우팅 (1:N) | sample.routing.# (*도 가능) |
| Headers | 메시지 헤더의 Key-Value 쌍을 기반으로 메시지가 특정 큐로 전달 | 사용하지 않음 |
docker pull rabbitmq:management
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 --restart=unless-stopped -e RABBITMQ_DEFAULT_USER=username -e RABBITMQ_DEFAULT_PASS=password rabbitmq:management



<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
<scope>test</scope>
</dependency>
spring:
rabbitmq:
username: guest
password: guest
host: 133.186.241.167
port: 5672
public class RabbitConfig {
private static final String EXCHANGE_NAME = "sample.exchange";
private static final String QUEUE_NAME = "sample.queue";
private static final String ROUTING_KEY = "sample.routing.key";
@Bean
DirectExchange exchange() {
return new DirectExchange(EXCHANGE_NAME);
}
@Bean
Queue orderQueue() {
return new Queue(QUEUE_NAME);
}
@Bean
Binding orderBinding(Queue orderQueue, DirectExchange exchange) {
return BindingBuilder.bind(orderQueue).to(exchange).with(ROUTING_KEY);
}
@Bean
RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
return rabbitTemplate;
}
}
private static final String EXCHANGE_NAME = "sample.exchange";
@Autowired
RabbitTemplate rabbitTemplate;
@GetMapping("/sample/queue")
public String samplePublish() {
rabbitTemplate.convertAndSend(EXCHANGE_NAME, "sample.routing.key", "Log Test");
return "Hello Rabbit!";
}
public class SampleListener {
private static final Logger log = LoggerFactory.getLogger(SampleListener.class);
RabbitTemplate rabbitTemplate;
@RabbitListener(queues = "sample.queue")
public void processPayment(String message) {
log.info("Listen" + message);
}
}
- Producer (convertAndSend): 편지를 우체국에 맡기는 사람
- RabbitMQ (Exchange + Queue): 편지를 분류하고 목적지로 전달하는 우체국
- Consumer (Listener): 편지를 받아 읽고 행동하는 사람