본문 바로가기

프로그래밍/분산처리

분산처리_메시지큐(MQ), rabbitMQ

반응형

메시지 큐(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);
    }
}

 

반응형