Shovel은 RabbitMQ의 주요 플러그인 중 하나로, Source에서 Destination으로 데이터를 단방향으로 전달하는 역할을 한다.
Shovel은 Source 환경을 건들지 않고, 메세지들을 다른 브로커 또는 환경으로 이동시켜서 어떠한 작업을 해주기 위해서 사용한다.
대략적으로 Shovel의 동작방식을 이야기하자면, 아래와 같다.
Shovel을 제대로(?) 구축하려면 2개 이상의 RabbitMQ 브로커가 있어야한다. 그래서 아래와 같은 docker-compose.yml
을 작성한 후, 컨테이너를 실행하자.
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
rabbitmq-plugins enable rabbitmq_shovel rabbitmq_shovel_management
위에서 생성한 두 컨테이너에 접속해서 위 명령어를 실행해주자.
RabbitMQ Management UI의 Admin 탭에 들어가보면, 이렇게 Shovel 관련 섹션이 생성된 것을 확인할 수 있다.
지금 세팅할 Shovel은 특정 큐에서 다른 큐로 데이터를 포워딩하는 것이므로, 두 RabbitMQ 브로커에 큐를 생성해주자.
나는 q.test
라는 같은 이름의 큐를 각각 생성해주었다.
amqp 0.9.1
프로토콜을 사용해서 위와 같이 Shovel을 생성해준다.
Admin > Shovel Status 탭
으로 이동해보면, 이렇게 Shovel이 생성되어 있는 것을 확인할 수 있다.
Shovel 생성이 완료됐으니, 이제 메세지 포워딩이 잘 되는지 확인해보자.
먼저, rabbitmq-1 브로커에서 몇 개의 메세지를 발행해보자.
rabbitmq-2 브로커에 들어가서 큐에 메세지가 쌓여 있는지 확인해보면, 잘 쌓여있는 것을 확인할 수 있다.
또, 이 메세지들을 컨슈밍해보면, 헤더에 Shovel과 관련된 정보가 들어가 있는 것 또한 확인할 수 있다.
이로써 rabbitmq-1에 들어온 메세지들이 rabbitmq-2로 잘 포워딩된 것을 확인할 수 있다.