반응형
메시지 큐(MQ)란

- 메시지 큐는 분산 시스템 간에 비동기적으로 데이터를 교환하기 위한 중간 매개체
- 송신자는 메시지를 큐에 전송하고, 수신자는 큐에서 메시지를 받아 처리
메시지 큐 특징
- 비동기 통신 : 송신자가 메시지를 큐에 넣고, 수신자는 큐에서 메시지를 가져와 처리
동기적인 방식보다 유연하고 효율적인 통신 가능 - 결합도 감소 : 메시지 큐를 통해 각 컴포넌트는 서로 독립적으로 동작
각 컴포넌트가 메시지 큐를 통해 통신하므로 직접적인 결합도 감소 및 모듈화 확장 가능 - 비동기 처리 이벤트 처리 : 이벤트 기반 시스템에서 유용하게 사용
이벤트가 발생하면 해당 이벤트를 메시지로 큐에 전송하고, 수신자는 해당 이벤트를 처리 - 확장성 및 부하분산 : 대량의 메시지를 안정적으로 처리
여러 수신자가 큐에서 메시지를 처리하므로 부하를 분산 - 데이터 보존 및 복구 : 메시지를 안전하게 저장
데이터 보존 복구 가능 및 데이터 유실 방지와 안정성 향상
AMQP(Avanced Message Queuing Protocol)란
다양한 메시지 큐 시스템 간의 통신을 위한 표준화된 프로토콜 제공
AMQP 중에서 대표적으로 사용되는 구현체는 RabbitMQ, Apache Kafka, ActiveMQ, Amazon SQS 등이 있음
RabbitMQ란
- AMQP프로토콜을 기반으로 하는 오픈 소스 메시지 브로커
- 메시지를 안전하게 저장하고 전달하는 역할
- 다양한 메시징 패턴 지원 및 여러 언어와 플랫폼에서 사용 가능
- 신뢰성 있고 확장 가능한 큐 솔루션
RabbitMQ 맛보기
1. RabbitMQ 서버 설치
https://www.rabbitmq.com/
2. 라이브러리 추가
RabbitMQ의 라이브러리인 'amqp-client'를 사용
gradle 의존성 추가
dependencies { implementation 'org.springframework.boot:spring-boot-starter-amqp' }
3. application.properties
spring.rabbitmq.host=localhost
spring.rabbitmq.port=9999
spring.rabbitmq.username=test
spring.rabbitmq.password=test
4. RabbitMQConfig.java
@Configuration
public class RabbitMQConfig {
@Value("${spring.rabbitmq.host}")
private String host;
@Value("${spring.rabbitmq.port}")
private int port;
@Value("${spring.rabbitmq.username}")
private String username;
@Value("${spring.rabbitmq.password}")
private String password;
@Bean
public CachingConnectionFactory connectionFactory() {
// CachingConnectionFactory 클래스는 RabbitMQ에 대한 연결을 관리하는데 사용되는 Spring AMQP 클래스
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
return connectionFactory;
}
@Bean
public RabbitTemplate rabbitTemplate() {
// RabbitTemplate 객체 생성 및 ConnectionFactory 주입
return new RabbitTemplate(connectionFactory());
}
// Queue 빈 생성 메서드
@Bean
public Queue queue() {
// queue 라는 이름을 사용
return new Queue("queue");
}
}
5. MessageProducer.java 메세지 전송자
@Component
public class MessageProducer {
private final RabbitTemplate rabbitTemplate;
@Autowired
public MessageProducer(RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
}
public void sendMessage(String message) {
// Queue에 메세지 보냄
rabbitTemplate.convertAndSend("queue", message);
System.out.println(message);
}
}
6. MessageReceiver.java 메세지 수신자
@Component
public class MessageReceiver {
@RabbitListener(queues = "queue")
public void receiveMessage(String message) {
System.out.println(message);
}
}
반응형