2013-10-14 7 views
35

제가 일하는 회사의 경우 RabbitMQ를 메인 메시지 버스로 사용하고 싶습니다. 우리가 가진 아이디어는 모든 단일 애플리케이션이 내부 통신을 위해 자신의 가상 호스트를 사용하며 셔블 또는 연합 플러그인을 통해 여러 가상 호스트 (클러스터되지 않은 여러 시스템)에 걸쳐 특정 유형의 이벤트를 공유 할 수 있다는 것입니다. . 우리는 공개 이벤트와 내부 통신을 분리하고 애플리케이션마다 보안을 조정할 수 있도록 vhost별로 애플리케이션을 선택했습니다.RabbitMQ 삽을 언제 사용하고 연맹 플러그인을 사용합니까?

RabbitMQ 웹 사이트에 게시 된 정보에 따르면 내가 삽을 선택해야하거나 연합 플러그인을 선택해야 할 때 얻지 못합니다.

RabbitMQ가있는 경우 무엇을 사용하는 explanation을 다음

는 일반적으로 당신이 연맹이 제공하는 것보다 더 많은 컨트롤을 필요로 할 때 인터넷을 통해 브로커를 연결하는 삽을 사용합니다.

연맹을 선택할 때 누락 된 삽의 미세 입자 제어 란 무엇입니까?

페더레이션 플러그인에서 제공하는 REST API를 통해 가상 호스트 간 통신을 자동화 할 수 있기 때문에 현재로서는 페더레이션 플러그인을 선호한다고 생각합니다. 셔블의 경우 삽의 구성을 변경하고 가상 호스트간에 이벤트를 공유 할 때마다 RabbitMQ 인스턴스를 재부팅해야합니다. 이것에 대한 나의 생각은 정확합니까?

현재 .NET에서 연결하는 클라이언트로 Windows에서 RMQ를 실행하고 있습니다. 가까운 장래에 Java/Perl/PHP 클라이언트가 참여할 것입니다.

내 질문을 요약하면 :

  • I
    가 페더레이션 선택할 때 내가 놓친 거지 삽에서 미세 입자 제어는 무엇입니까?
  • 셔블을 사용할 때 virtual-communication을 변경하는 유일한 방법은 theconfig 파일을 변경하고 인스턴스를 재부팅하는 것입니까?
  • 설정 (응용 프로그램 당 가상 호스트)이 의미가 있거나 요점이 완전히 누락 되었습니까? 잘 설계된 같은

답변

25

삽과 대기열은 한 RabbitMQ 노드에서 다른 RabbitMQ 노드로 메시지를 전달하는 다른 방법을 제공합니다. 연합 Exchange와 연합 환

는 큐 상류 (소스) 노드에서 큐에 접속 될 수있다. 또한, 다운 스트림 (목적지) 노드의 교환기는 업스트림 노드에 공개 된 메시지의 사본을 수신합니다.

페더레이션 교환은 교환 교환 바인딩과 유사하므로 업스트림 교환기의 제한된 메시지 세트에 가입 할 수 있습니다 (선택 사항).

연합 큐 (참고 :이 RabbitMQ의 3.2.x에서 새로운) 연합 큐와

는, 소비자는 업스트림 (소스) 및 다운 스트림 (대상) 노드 모두에서 큐에 연결할 수 있습니다 .

본질적으로 다운 스트림 큐는 업스트림 큐에 연결된 소비자와 동일한 방식으로 메시지를 처리하는 추가 다운 스트림 소비자가있을 것으로 예상하여 업스트림 큐의 소비자입니다.

다운 스트림 (페더레이션) 큐에서 사용되는 모든 메시지는 업스트림 큐의 소비자에게 제공되지 않습니다.

사용 사례 :

소비자가 다른 하나 개의 노드에서 마이그레이션되는 경우

, 연합 대기열이 두 번 놓친 또는 처리중인 메시지없이 일어날 수 있습니다.

사용 사례 : from the RabbitMQ docs

전형적인 사용은 동일한 "논리적"큐는 많은 브로커를 통해 를 배포하는 것입니다. 각 브로커는 인 페더 레이 티드 큐를 다른 모든 페더 레이 티드 큐를 업스트림으로 선언합니다. (링크는 N 대기열에 완전한 양방향 그래프를 형성한다.) 반면에,

삽하는 "하류"과거에 "상류"큐 첨부. 셔블 문서는 연합 문서와 동일한 의미론을 가진 노드를 설명하지 않기 때문에 용어를 따옴표로 묶습니다.

삽은 대기열의 메시지를 사용하여 대상 노드의 교환기로 보냅니다. (참고 : 일반적으로이 패턴의 일부로 설명하지는 않지만 소비자가 원 래 노드의 대기열에 연결하는 것을 막는 것은 없습니다.)

특정 질문에 답하려면

내가 페더레이션 선택 때 누락하고 삽에서 미세 입자 제어가 무엇입니까?

삽은 "상류"또는 "다운 스트림"노드에 상주하는이없는 않습니다. 독립 노드에서 구성 및 작동 할 수 있습니다.

삽은 링키지의 모든 요소, 즉 소스 큐, 큐의 바인딩 및 대상 교환을 만들 수 있습니다. 따라서 소스 노드 또는 대상 노드 중 하나에 비 침입 적입니다.

은 내가 삽이 파일을 theconfig 변경하고 인스턴스를 재부팅되는 사용하는 경우 유일한 방법은 간 가상 호스트 통신을 변경하는 것이 맞습니까?

이것은 일반적으로 삽의 허용 된 단점이었습니다.

다음 명령 (주의 : RabbitMQ 3.1.x에서만 테스트되었으며, 해당 파일에만 포함 된 rabbitmq.config 파일 만 사용 가능)을 사용하여 지정한 파일에서 삽 구성을 다시로드 할 수 있습니다. (이 경우 /etc/rabbitmq/rabbitmq.config)

rabbitmqctl eval 'application:stop(rabbitmq_shovel), {ok, [[{rabbit, _}|[{rabbitmq_shovel, [{shovels, Shovels}] }]]]} = file:consult("/etc/rabbitmq/rabbitmq.config"), application:set_env(rabbitmq_shovel, shovels, Shovels), application:start(rabbitmq_shovel).' 

.

설정 (애플리케이션 당 가상 호스트)이 의미가 있습니까, 아니면 포인트가 완전히 누락 되었습니까?

이 결정은 사용 사례에 따라 다릅니다. 가상 호스트는 주로 대기열/교환 장치와 권한이 부여 된 사용자 간의 논리적 (액세스) 분리를 제공합니다.

13

행위에 내장 된 소비자. 소스 브로커 및 대기열의 메시지를 소비하여 대상 브로커 및 교환에 게시 할 수 있습니다. 당신이 할 수있는 응용 프로그램을 작성할 수 있지만 셔블은 이미 올바르게 처리되었습니다. 필요한 것이 있다면 같은 브로커 또는 다른 브로커의 대기열에서 교환기로 메시지를 이동하는 것입니다. 삽은 당신을 위해 그것을 할 수 있습니다. 잘 작동하는 앱처럼, 교환/대기열/바인딩 선언, 다시 연결, 라우팅 키 변경 등을 할 수 있습니다. 소스 또는 대상 브로커에서 설정하거나 세 번째 브로커를 사용할 수도 있습니다. 그것은 기본적으로 AMQP 클라이언트입니다.

연합은 브로커를 하나 이상의 업스트림 브로커에 연결하는 데 사용되거나 브로커 체인을 만들 수 있으며 원하는 방식으로 토폴로지를 구부릴 수도 있습니다. 교환 또는 대기열을 연합 할 수 있습니다 (예 : 추가 대기열을 주제 교환기에 바인드하거나 팬 아웃 교환기를 사용하지 않고 각 대기열의 메시지를 다운 스트림 브로커로 밀어 넣지 않고도 여러 브로커에 메시지를 분배 할 수 있습니다.

연쇄는 더 높은 수준에서 작동하지만 삽은 대부분 잘 작성된 클라이언트입니다.

삽을 다시 구성하려면 불행히도 브로커를 다시 시작해야합니다.

별로 응용 프로그램 가상 호스트가 필요하다고 생각하지 않습니다. 별개의 가상 호스트없이 브로커에 앱 별 사용자를 추가 할 수 있습니다. 하지만 "가상 호스트간에 이벤트 공유"에 대한 의미는 확실하지 않습니다.

+8

RabbitMQ는 이제 다시 시작하지 않아도되는 "동적 삽"을 지원합니다. http://www.rabbitmq.com/shovel.html –