RabbitMQ

0

TIL

목록 보기
141/183

RabbitMQ는 오픈 소스 메시지 브로커 소프트웨어로, 메시지 전송과 수신을 관리하고 조정하는 역할을 하며, 주로 애플리케이션 간의 비동기 통신을 위한 메시지 큐잉을 지원한다.

  • 메시지 큐잉 : 메시지를 일시적으로 저장하고 관리하며, 프로듀서와 컨슈머 간의 메시지 전달을 조정한다.
  • 메시지 브로커 : 여러 클라이언트 애플리케이션 사이에서 메시지를 라우팅하고 전달하는 역할.
  • 교환기 (Exchanges) : 메시지를 특정 큐로 라우팅하기 위해 사용된다. (Direct Exchange : 메시지를 라우팅 키를 기준으로 특정 큐에 전달)
  • 큐 (Queues) : 메시지를 저장하고, 컨슈머가 이를 수신할 때까지 유지한다.

실습을 위해 프로젝트 준비를 한다.

  • build.gradle
testImplementation 'org.springframework.amqp:spring-rabbit-test'

  • application.properties
spring.application.name=order

message.exchange=market
message.queue.product=market.product
message.queue.payment=market.payment

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest

  • OrderApplicationQueueConfig
@Configuration
public class OrderApplicationQueueConfig {
    @Value("${message.exchange}")
    private String exchange;
    @Value("${message.queue.product}")
    private String queueProduct;
    @Value("${message.queue.payment}")
    private String queuePayment;

    // exchange 생성
    @Bean
    public TopicExchange exchange() {
        return new TopicExchange(exchange);
    }

    // queue 생성
    @Bean
    public Queue queueProduct() {
        return new Queue(queueProduct);
    }
    @Bean
    public Queue queuePayment() {
        return new Queue(queuePayment);
    }

    // binding 생성 - exchange(market)에서 queue로 연결하는 통로
    @Bean
    public Binding bindingProduct() {
        return BindingBuilder.bind(queueProduct()).to(exchange()).with(queueProduct);
    }
    @Bean
    public Binding bindingPayment() {
        return BindingBuilder.bind(queuePayment()).to(exchange()).with(queuePayment);
    }
}

  • OrderController
@RestController
@RequiredArgsConstructor
public class OrderController {
    private final OrderService orderService;

    @GetMapping("/order/{id}")
    public String order(@PathVariable("id") String id) {
        orderService.createOrder(id);
        return "Order Complete";
    }
}

  • OrderService
@Service
@RequiredArgsConstructor
public class OrderService {
    @Value("${message.queue.product}")
    private String productQueue;
    @Value("${message.queue.payment}")
    private String paymentQueue;
    private final RabbitTemplate rabbitTemplate;

    public void createOrder(String orderId) {
        rabbitTemplate.convertAndSend(productQueue, orderId);
        rabbitTemplate.convertAndSend(paymentQueue, orderId);
    }
}



application을 실행하고 요청을 보낸 뒤
http://localhost:{설정된 port번호}로 접속하여 RabbitMQ의 요청된 Exchange와 Queue를 확인할 수 있다.


현재는 보내질 컨슈머가 없는 상태이기 때문에 queue 내부에 메시지가 쌓여있는 모습


라우팅 키와 큐의 이름을 일치시켜서 바인딩에 혼란을 줄여줄 수 있다.

0개의 댓글

관련 채용 정보