[Road To MQ] RabbitMQ로 메세징 - Exchange의 Topic (Listener)

CodeKong의 기술 블로그·2024년 1월 28일
2

Road To MQ

목록 보기
6/6
post-thumbnail

안녕하세요 오늘은 Road To MQ 여섯번째 아티클인 RabbitMQ로 메세징 - Exchange의 Topic (Listener)입니다!

지난 아티클 에서 WebSocket + stomp + RabbitMQ의 Topic을 구현해 보았는데요

WebSocket, stomp를 제거하고 RabbitMQ 만으로 메세징을 해보겠습니다!

📌 배경

RabbitMQ에서 제공해주는 @RabbitListener 를 사용해주면 쉽게 메세지를 수신할 수 있습니다!

📌 기본 구성

시나리오는 저번 아티클 과 같습니다!

exchange와 queue도 동일 하구요!


🛠️ 코드 변경점

저번 코드에서 변경된 점은 stompConfig의 제거와 Controller 구조 변경이 있습니다!

RabbitPublishController

@RestController
@Slf4j
@RequiredArgsConstructor
public class RabbitPublishController {

    private final RabbitTemplate rabbitTemplate;

    @PostMapping("/send/sales/staff")
    public String sendSalesStaff(@RequestBody String message) {
        log.info("-------log-------");
        log.info("sales부서의 staff에게 {" + message + "} 라는 메시지를 보냅니다.");
        log.info("-------log-------");
        rabbitTemplate.convertAndSend("JunWooCompany", "sales.staff", message);
        return message;
    }

    @PostMapping("/send/sales/director")
    public String sendSalesDirector(@RequestBody String message) {
        log.info("-------log-------");
        log.info("sales부서의 director에게 {" + message + "} 라는 메시지를 보냅니다.");
        log.info("-------log-------");
        rabbitTemplate.convertAndSend("JunWooCompany", "sales.director", message);
        return message;
    }

}

메세지를 발행하는 Controller 입니다.
REST API 방식으로도 접근할 수 있습니다!

여기서는

  • sales 부서의 staff
  • sales 부서의 director
    에게 메세지를 발행 할 수 있도록 하였습니다!

RabbitConsumeController

@Slf4j
@Controller
@RequiredArgsConstructor
public class RabbitConsumeController {


    @RabbitListener(queues = "sales.staff")
    public void salesStaff(String message) {
        log.info("-------log : 저는 sales부서의 staff의 메세지를 수집합니다-------" +
                "\nsales부서의 staff에게 보낸 {" + message + "} 라는 메시지를 받았습니다." +
                "\n-------log-------");
    }

    @RabbitListener(queues = "sales.director")
    public void salesDirector(String message) {
        log.info("-------log : 저는 sales부서의 director의 메세지를 수집합니다-------" +
                "\nsales부서의 director에게 보낸 {" + message + "} 라는 메시지를 받았습니다." +
                "\n-------log-------");
    }

    @RabbitListener(queues = "Allstaff")
    public void allStaff(String message) {
        log.info("-------log : 저는 모든 staff의 메세지를 수집합니다-------" +
                "\n모든 staff에게 보낸 {" + message + "} 라는 메시지를 받았습니다." +
                "\n-------log-------");
    }

    @RabbitListener(queues = "Allsales")
    public void allSales(String message) {
        log.info("-------log : 저는 sales부서의 모든 메세지를 수집합니다-------" +
                "\nsales부서의 staff에게 보낸 {" + message + "} 라는 메시지를 받았습니다." +
                "\n-------log-------");
    }

}

메세지를 수신하는 Controller 입니다.
RabbitListener 어노테이션으로 메세지를 감지하며 queues에는 생성된 queue의 이름을 작성하면 됩니다!

여기서는

  • sales 부서의 staff
  • sales 부서의 director
  • sales 부서의 모든 메세지
  • staff 직급의 모든 메세지
    에게 오는 메세지를 수신할 수 있도록 하였습니다!

🚩 테스트

sales.staff 로 발행을 하면 패턴이 일치하는 리스너들로 잘 매핑 됩니다!


sales.director 로도 발행을 해보겠습니다.

로그가 잘 찍힙니다!🔫🔫


🚩 결론

RabbitMQ는 패턴 매칭을 통한 기능이 강력한 Broker 였습니다!
등급별, 부서별 등 분류가 되는 객체들에 대해서 대규모 처리를 할 때 효율이 좋을 것 같다고 생각합니다.

다음 Redis에서 만나요!

0개의 댓글