티스토리 뷰

반응형

 

RabbitMQ는 AMQP를 따르는 오픈소스 메세지 브로커인데, 메세지를 많은 사용자에게 전달하거나,

요청에 대한 처리 시간이 길 때, 해당 요청을 다른 API에게 위임하고 빠른 응답을 할 때 많이 사용합니다.

또한, MQ를 사용하여 애플리케이션 간 결합도를 낮출 수 있는 장점도 있습니다.

 

기본적 개념에 대한Reference: blog.dudaji.com/general/2020/05/25/rabbitmq.html

 

RabbitMQ란?

서비스를 개발하면서 API-Gateway에 토큰 캐시를 구축하기 위해 RabbitMQ를 공부했던 내용을 정리해 보았습니다.

blog.dudaji.com

스프링에서 제공하는 실제 사용 로직: spring.io/guides/gs/messaging-rabbitmq/

 

 

Messaging with RabbitMQ

this guide is designed to get you productive as quickly as possible and using the latest Spring project releases and techniques as recommended by the Spring team

spring.io

영어 문서는 다소 복잡해서 쉽게 소스를 올려서 사용해보고자 합니다. 

먼저 RabbitMQ를 사용하기 전 Configuration을 적용하는 클래스입니다.

@Configuration
public class RabbitConfig {

    public static final String queueName = "queue-name";
    public static final String topicExchangeName = "topic-exchange";

    @Bean
    Queue queue() {
        return new Queue(queueName, false);
    }

    @Bean
    TopicExchange exchange() {
        return new TopicExchange(topicExchangeName);
    }

    @Bean
    Binding binding(Queue queue, TopicExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("project.#");
    }

    @Bean
    RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory,
                                  MessageConverter messageConverter) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(messageConverter);
        return rabbitTemplate;
    }

    @Bean
    MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}
@Service
@Slf4j
public class MessageService {

    @Resource(name = "rabbitTemplate")
    private RabbitTemplate rabbitTemplate;

    @Autowired ObjectMapper objectMapper;

    final String subject = "SUBJECT_NAME";

    public void sendMessage(MessageEnum action, Map<String, Object> data) throws Exception {
        Map<String, Object> body = Map.of("subject", subject, "action", action.name(), "data", data);
        String stringify = objectMapper.writeValueAsString(body);
        log.info("Send Message Stringify : " + stringify);
        rabbitTemplate.convertAndSend(RabbitConfig.topicExchangeName, "topic.exchange", stringify);
    }
}

위의 소스 내용은 메시지가 어떠한 액션인지와 그에 필요한 데이터를 메시징 서비스에 제공하는 함수를 구현한 내용입니다.

 

실제로 사용하려면 이렇게 적용해도 되겠죠?

public void sendMessageForUpdateMember(String memberId) throws Exception {
    messageService.sendMessage(MessageEnum.CHANGE_MEMBER_INFO, Map.of("memberId", memberId));
}
반응형
댓글
공지사항