2011-05-13 2 views
0

나는 전체 AMQP 일에 받고 있어요 그리고 난에서 사용하는 교환 형의 유형에 관한 질문이 다음과 같은 시나리오의 :AMQP 교환 유형

1) 내가 어디에 각 작업자 풀을 생성 할 필요가있다 직원이 메시지를 받으면 무언가를합니다. 이제는 다른 유형의 업무에 연결된 다른 직원을 원합니다. 이는 주제별로 각 메시지의 라우팅 키를 사용하여 지정할 수 있습니다. kombu와 조금 주위에 놀아 소비자의 끝에서, 만약 내가 동일한 큐 이름을 지정하지만 다른 라우팅 키로 나는 메시지를 '걸러 낼 수 없다. 예를 들어 하나의 소비자가 '#'이고 다른 하나가 'foo. #'인 경우 - 둘 다 동일한 대기열 이름을 사용하는 경우 후자의 소비자는 이전 소비자와 대기열에서 라운드 로빈을 처리합니다. 기대 되니? 나는 동일한 기계에서 두 소비자를 모두 실 행하고있다.

2) 그래서 각 소비자에 대해 고유 한 대기열 이름을 만들고이 시간에 각 소비자는 내가 라우팅 키로 요청한 것만 얻습니다. 그러나, 그들은 별개의 대기열이기 때문에, 나는 단지 하나의 소비자 이상에서 작업을 얻을 수 있습니다. 예를 들어 소비자 1이 키 '#'을 가지고 있고 소비자 2가 'foo. #'을 가지고 있다면; 소비자 2가 메시지를 수신 (및 확인)하면 소비자 1도 동일한 메시지를받습니다. 이것은 내가 원하는 것이 아닙니다. 나는 오직 한 명의 소비자에게 메시지를 전하기를 원합니다. '작업 관리자'를 작성하지 않고도이 작업을 수행 할 수있는 방법이 있습니까?

환호,

답변

0

은 대부분의 사람들에게 그것은 완전히 방법 AMQP 작품을 이해할 때까지 모든 걸에 대한 주제 교환을 사용하는 것이 가장 좋습니다. 대기열에 적합한 바인딩 키를 선택하면 팬 아웃 및 직접 동작을 얻을 수 있습니다. 예를 들어 바인딩 키에 "#"을 사용하면 해당 대기열은 직접 교환기에 연결된 것처럼 작동합니다. 두 개 이상의 대기열을 동일한 라우팅 키에 바인드하면 해당 대기열은 팬 아웃 교환이었던 것처럼 작동합니다.

라운드 로빈 동작이 필요합니다. 두 작업 모두 정확히 동일한 대기열에 등록됩니다. 바인딩 키가 다르다는 사실은 모든 것을 혼란스럽게 만듭니다. 아마도 마지막에 바인딩하는 사람은 모든 대기열 사용자에 대한 바인딩 키를 설정합니다. 그 일을하지 않는 것이 가장 좋습니다. 필자는 몇 개의 큐가 정확히 같은 작업자 코드의 4에서 15 개의 인스턴스를 가지며 동일한 큐에서 메시지를 가져온 다음 웹 서비스에서 데이터를 수집하는 시스템을 구축합니다. 나는 성능면에서 반드시 필요한 것은 아니지만 결국 다른 CPU에서 실행되는 작업자를 보유하게되었습니다.

왜 바인딩 키에 와일드 카드를 사용하는지 잘 모르겠습니다. A ~ H라는 8 명의 소비자가 있고 각자 다른 작업을 수행하는 경우 라우팅 키를 사용하여 메시지를 게시하지 않는 것이 좋습니다. 작업을 통해 A.H를 사용하고 동일한 바인딩 키를 사용합니다. 작업을 통해 A.H. 그렇게하면 작업자 B의 인스턴스가 여러 개 있으면 작업 B에 바인딩되고 메시지가 두 번 전달되지 않습니다.

또한 메시지를 처리 ​​한 후에 응답하지 않으면 결국 대기열로 돌아가서 다시 배달됩니다. 잘하면 당신은 성공적으로 메시지를 처리 ​​후 acking 있습니다. AMQP 노브를 더 잘 이해하면 작업 관리자가 필요하지 않습니다.