Skip to content

[RabbitMQ] Routing(선택적으로 메세지 받기)

2012/02/10

Routing

지난 포스트에서는 Publish/Subscribe 패턴을 적용하여 exchange에 바인딩된 모든 queue들에 message를 보내는 방법에 대해 정리했습니다.

즉 producer에서 발생하는 모든 message를 faout 타입의 exchange에 보내면 그 exchange에 바인딩된 queue들을 통해 consumer에 전달이 되고, 한 consumer는 실시간으로 콘솔에 message를 출력하고 다른 consumer는 파일에 저장하는 logging system을 예로 들면서 설명했습니다.

하지만 만약 위와 같이 모든 message를 파일에 저장하는 logging system을 만든다면 엄청난 disk용량이 필요하게 되고 결국 많은 유지 비용이 필요하게 됩니다. 그래서 위에 그림처럼 1개의 queue에는 error message만 전달해서 파일에 저장하도록 하고 다른 queue에는 기존과 같이 모든 message를 전송해서 콘솔을 통해 실시간으로 모니터링할 수 있는 방법에 대해 알아보겠습니다.

Direct exchange

기존 fanout exchange는 아래와 같이 queue와 바인딩 하였습니다.

channel.queueBind(queueName, EXCHANGE_NAME, "");

하지만 아래와 같이 routingKey라는 추가 파라미터를 통해 exchange와 queue를 바인딩 할수 있습니다.

channel.queueBind(queueName, EXCHANGE_NAME, "error");

위와 같이 정의했을경우 EXCHANGE_NAME을 가지는 direct exchange에서 error라는 routingKey를 가지는 message만을 queueName을 가지는 queue에 전송하게 됩니다.

Tip 1. fanout exchange는 routingKey를 무시합니다.

그리고 아래처럼 한개의 queue에는 다른 이름을 가지는 routingKey가 여러개 할당될수 있습니다.

그리고 다음과 같이 한개의 routingKey는 여러개의 다른 queue에 할당될수 있습니다.(fanout 처럼 동작)

결국 logging system을 consumer1에서 error만 파일에 저장하고 consumer2에서 info, warning, error을 콘솔에 보여주기 위해서는 consumer1에 연결된 queue에 error라는 routingKey를 바인딩 하고 consumer2에 연결된 queue에는 info,waring,error라는 routingKey를 바인딩한 후에  producer에서 message를 exchange에 전송할때 아래와 같이 exchange name과 routingKey를 지정해 주면 됩니다.

 channel.basicPublish(EXCHANGE_NAME, "error", null, message.getBytes());

No comments yet

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: