본문 바로가기

개발

rabbitmq tutorial 3 - routing

Routing

메시지 중 일부만 구독할 수 있게 해줄 겁니다. 예를 들어, 중요한 오류 메시지만 로그 파일에 전송(디스크 공간을 절약하기 위해)할 수 있으며, 동시에 콘솔에 있는 모든 로그 메시지를 print 할 수 있다.

Bindings


이전 예에서 우리는 이미 바인딩을 만들고 있었다. 다음과 같은 코드를 리콜할 수 있음:
channel.queueBind(queueName, EXCHANGE_NAME, "");
binding은 exchange과 queue 사이의 관계다. queue는 이 exchange의 메시지에 관심이 있다.

binding은 추가적인 routingKey 매개변수를 취할 수 있다. basic_publish 매개 변수와의 혼동을 피하기 위해 우리는 그것을 바인딩 키라고 부른다. 다음과 같이 키로 바인딩을 만들 수 있다.
channel.queueBind(queueName, EXCHANGE_NAME, "black");
바인딩 키의 의미는 exchange type에 따라 다르다.

Direct exchange

이전 튜토리얼의 로그 시스템은 모든 메시지를 모든 소비자에게 브로드캐스트한다. 우리는 그것의 심각성에 기초한 필터링 메시지를 허용하기 위해 그것을 확대하기를 원한다. 예를 들어, 우리는 디스크에 로그 메시지를 쓰는 프로그램이 심각한 오류만 받고 경고나 정보 로그 메시지에서 디스크 공간을 낭비하지 않기를 바랄 수 있다.

우리는 flexibility를 주지 않는 fanout exchange를 사용하고 있었다. 그것은 단지 무의미한 broadcasting이다.

우리는 대신 direct exchange를 사용 할 것이다. 라우팅 알고리즘 direct exchange는 간단하다. 메시지는 바인딩 키가 메시지의 라우팅 키와 정확히 일치하는 대기열로 간다.


이 설정에서는 두 개의 큐가 묶여 있는 direct exchange X를 볼 수 있다. 첫 번째 큐는 바인딩 키 orange로 묶이고, 두 번째 대기열에는 바인딩 키 black 과 green이 있다.

그러한 설정에서는 라우팅 키 orange 과 교환에 게시된 메시지가 Q1 대기열에 배치된다. 라우팅 키가 black 또는 green인 메시지는 Q2로 이동한다. 다른 모든 메시지는 폐기될 것이다.

Multiple bindings


여러 줄을 같은 바인딩 키로 묶는 것은 괜찮다. 예에서 우리는 X와 Q1 사이에 바인딩 키 검은색으로 바인딩을 추가할 수 있다. 이 경우, 직접 교환은 팬아웃처럼 행동하고 메시지를 일치되는 모든 대기열에 broadcast 할 것이다. 경로 키 블랙 메시지가 Q1과 Q2로 모두 전달된다.

Emitting logs

우리는 이 모델을 우리의 log 시스템에 사용할 것이다. fanout 대신에 direct exchange로 메시지를 보낼 것이다. log 심각도를 라우팅 키로 제공할 것이다. 그렇게 하면 수신 프로그램이 수신을 원하는 심각도를 선택할 수 있을 것이다. 먼저 log를 emitting하는 것에 집중하자.

1. 익스 체인지 먼저 만들고
channel.exchangeDeclare(EXCHANGE_NAME, "direct");

2. 그러면 메세지를 보낼 준비가 되엇다. 
channel.basicPublish(EXCHANGE_NAME, severity, null, message.getBytes());

Subscribing


메시지 수신은 이전 튜토리얼과 마찬가지로 작동하지만, 한 가지 예외는 있다. 우리는 log severity 에 대해 새로운 바인딩을 만들 것이다.

Putting it all together