[RabbitMQ] Federation 사용하기

🔥Log·2024년 6월 13일
0

RabbitMQ

목록 보기
8/9

🧐 Federation


RabbitMQ에서 Federation이란, 두 RabbitMQ 클러스터를 하나의 개념으로 묶는 것을 의미한다. Federation으로 묶이게 되면, 상위(Upstream) 클러스터의 정보들을 하위(Downstream) 클러스터로 전달 또는 복사할 수 있게 된다.

Federation의 특징

  1. 데이터는 Upstream에서 Downstream으로만 이동할 수 있다.
  2. 하나의 Upstream은 여러 개의 Downstream을 가질 수 있다.
  3. Exchange, Queue, Binding과 같은 Downstream의 정보들은 Upstream에 복사 및 공유된다.
  4. Upstream과 Downstream의 커넥션은 Downstream 측에서 맺게 된다.

Federated Exchange의 특징

Exchange는 한 개 이상의 Downstream Exchange들과 Federating될 수 있다. Federation되면, Upstream 클러스터에는 Downstrem exchange의 복사본이 있고, 여기에 들어온 메세지들은 Downstream exchange에 그대로 이동된다.

Federated Queue의 특징

Upstream 큐에 메세지를 발행하면 컨슈머가 연결되기 전까지는 Upstream 큐에 메세지가 쌓여있다.
그 후, 컨슈머가 Upstream 큐에 붙어서 메세지를 컨슈밍하면, Upstream 큐에서 컨슈밍이되고 Downstream 큐에 컨슈머가 연결되면 메세지가 Downstream으로 이동해서 Downstream 큐에서 컨슈밍된다.

즉, Federated queue는 어떤 큐에서 컨슈밍을 할지 선택할 수가 있게 된다.



💻 Federation 세팅하기


1) docker-compose

services:
  rabbitmq-1:
    image: rabbitmq:3.13.3-management
    container_name: rabbitmq-1
    hostname: rabbitmq-1
    ports:
      - 15672:15672
      - 5672:5672
  rabbitmq-2:
    image: rabbitmq:3.13.3-management
    container_name: rabbitmq-2
    hostname: rabbitmq-2
    ports:
      - 15673:15672
      - 5673:5672

Federation은 2개 이상의 클러스터가 필요하므로, 위와같은 docker-compose.yml을 작성한 후, 실행하자.

2) Federation plugin 설치

rabbitmq-plugins enable rabbitmq_federation rabbitmq_federation_management

위에서 생성한 2개의 RabbitMQ 컨테이너에 접속해서 위 명령어를 실행해주자.

3) Federation plugin 설치 확인

Admin 탭에 이렇게 Federation 섹션이 생겼다면, 플러그인이 정상적으로 설치가 된 것이다.



🐰 Federated exchange 사용하기


1) Downstream Exchange, Queue 생성

먼저 Downstream이 될 두 번째 RabbitMQ 클러스터에 Exchange와 Queue를 생성하고, 둘을 바인딩해주자.
나는 ex.test라는 Direct exchange와 q.test라는 Class queue를 만들어서 바인딩해주었다.

2) Federation 생성

Admin > Federation Upstream 섹션으로 이동한 후, Upstream link를 하나 만들어준다.

3) Policy 생성

위와 같이 Policy를 만들어주면, 방금 만든 Federation은 ex.test라는 이름을 갖는 Exchange에 적용할 수 있게 된다.

4) Federation 생성 확인

그 후, Federation status 섹션으로 이동해보면 이렇게 정상적으로 Federation이 생성된 것을 확인할 수 있다.

그리고, Upstream 클러스터인 첫번째 RabbitMQ의 Management UI에 접속해보면, 이렇게 Exchange와 Queue가 자동적으로 생성되어 있는 것을 확인할 수도 있다.

5) Upstream에서 메세지 발행

Upstream exchange에서 메세지를 발행해도 링크되어 있는 Downstream 큐로 메세지가 들어오는 것을 확인할 수 있다.

또, 수신한 메세지의 헤더에 어디로부터 온 메세지인지도 기록되어 있는 것을 확인할 수 있다.



🐰 Federated queue 사용하기


이전 섹션에 이어서, 이번엔 Federated queue를 세팅하고, 사용해보도록 하겠다.

1) Downstream 큐 생성

Downstream 브로커에서 큐를 하나 생성해주자.

2) Policy 생성

Upstream 링크는 위에서 만든 게 있으니, 큐를 맵핑해줄 Policy만 만들어주자.

3) Federation 생성 확인

Policy까지 만들고 나면, 이렇게 Federation이 잘 생성된 것을 확인할 수 있다.

그리고, Downstream에서 만든 큐와 동일한 이름과 설정을 갖고 있는 큐가 Upstream 브로커에서도 확인가능할 것이다.

4) Upstream에서 메세지 발행

Upstream에 생성된 큐에서 메세지를 발행해보면, 큐에 메세지가 들어가 있는 것을 확인할 수 있다.
이제 이 메세지들을 컨슈머 애플리케이션으로 읽어보자.

5) 컨슈머 애플리케이션으로 메세지 읽기

📌 컨슈머 애플리케이션을 만드는 방법은 이 글을 참고하자.

    @RabbitListener(queues = {"q.test.2"})
    public void consumeMessage2(Message msg) throws JsonProcessingException {
        String body = new String(msg.getBody());
        log.info(body);
    }

컨슈머 컨포넌트에 위와 같은 간단한 메서드를 하나 작성해주고, 애플리케이션을 실행해보겠다.

실행해보면, 정상적으로 메세지가 출력되고 이렇게 헤더에도 어디로부터 온 메세지인지 잘 명시되어 있는 것을 확인할 수 있다.



🙏 참고


0개의 댓글

관련 채용 정보