2016-11-26 5 views
0

AMQP에 nmew이고 RabbitMQ 시스템의 알림 아키텍처를 해결하려고합니다.RabbitMQ - 주제 교환 - 두 명 이상의 소비자가 같은 주제

토픽 교환 (NotificationsExchange, 추측 해 봅시다)을 원합니다. 특히 토픽 교환과 함께 제공되는 라우팅 키 및 대기열과 향후 확장을위한 옵션에 대한 유연성이 필요하기 때문입니다. 왜냐하면 나는 틀릴 수도 있습니다. 왜냐하면 ...

두 명 이상의 소비자가 각 알림을 사용하기를 원합니다. 기준선으로 게시 된 각 알림을 데이터베이스에 저장하려고합니다. 또한 각 알림을 클라이언트 응용 프로그램 (예 : 웹 응용 프로그램이 DB 폴링없이 즉각적인 사용자 알림을 사용하고 소켓을 통해 밀어 넣을 수 있음)에 의해 소비되기를 원합니다.

이것은 실제로 다양한 아웃 (AMQP에 익숙하지 않고 내 감싸기를 시도하는 것 같아요.)라고 생각합니다. 머리 주위에).

두 명의 소비자가 같은 대기열에서 (일관되게) 알리도록 할 수 있습니까?

예를 들어

다음 NotificationExchange 통해

  • 밀어 Notif.NotifGroup.User.ThisUser
  • 가지고 dbListener 바인드 Notif.#
  • 또한 Notif.# 결합 (추가 사용자가 온라인인지 확인하고 소켓을 통해 다운 스트림 밀어) mvcClientListener 되세요

나는 올바른 길을 가고 있는지 잘 모르겠다. 이자형. 나는 "동일한 대기열에있는 여러 소비자가로드 로빈 방식으로 균형을 이룬다"는 것을 읽고 있으며 솔직히 말해서 그 의미가 무엇인지 알지 못합니다.

2 명의 소비자가 동일한 대기열 (예 : 동일한 라우팅 키)에서 동일한 메시지를 일관되게 읽을 수있는 주제 교환을 할 수 있습니까? 아니면이를 위해 팬 아웃 교환을해야합니까?

감사합니다.

답변

2

두 명의 소비자가 같은 대기열에서 (일관되게) 알림을받을 수 있습니까?

예,하지만 원하는 것은 아닙니다.

하나의 큐에 여러 소비자가있는 경우 소비자는 라운드 로빈 부하가 분산됩니다. 소비자 1이 메시지 a를 수신하면 소비자 2는 대신

을받을 수 없으므로 각 소비자에 대해 경로 처리기를 추가하고 각 소비자가 자신의 대기열을 만들게하십시오.

예를 들어, NotificationEx은 에 대한 바인딩이 dbQueue으로 푸시 될 수 있습니다. 동일한 교환 프로그램은 에 대한 바인딩을 사용하여 메시지를 mvcQueue으로 푸시합니다.

데이터베이스 사용자가 dbQueue에서 소모되고 웹 응용 프로그램이 mvcQueue에서 소모됩니다.

이렇게하면 새 대기열을 추가하고 각 대기열과 교환기에 바인딩하는 것이 매우 쉽습니다.


FWIW에는 주어진 상황에 대해 "올바른"또는 "잘못된"교환 유형이 없습니다. 어떤 상황에서도 교환 유형을 사용할 수 있습니다. 그러나 일부 교환 유형을 사용하면 특정 상황을 쉽게 처리 할 수 ​​있습니다.

는 당신은 그들이 오히려 흥미로운 시나리오에서 어떻게 적용될 수 있는지, 교환 유형, 자신의 일반적으로 인정 된 "최고의 사용 사례"에 대한 자세한 내용은 RabbitMQ 내 전자 책을 확인 할 수 있습니다

: https://leanpub.com/b/rmq-layout-and-patterns

+0

감사합니다 - 난 '을 한게 t는 동일한 "푸시 기준 (push term)"에 기반하여 두 개의 완전히 별개의 대기열을 만들 수있는 경우 (정확한 용어가 부족하여이 세부 정보를 조금 더 자세히보아야 함) 알려졌다. 부수적으로, 나는 오늘 아침에 RabbitMQ를 파기 시작 했으므로 AMQP를 일반적으로 사용하기 시작했습니다. 그리고 이것은 네 번째 게시물입니다. SO (그리고 아마도 하나 또는 두 개의 블로그 게시물 일 수도 있습니다.)에서 주제를 보았습니다. 몇 시간 전에 전자 책을 읽었습니다. 도움이됩니다. – jleach

+0

BTW, 우연히 이러한 개별 대기열을 만드는 방법에 대한 간단한 예제를 던질 수 있다면 좋을 것입니다. 그렇지 않다면 나는 결국 그것을 발견 할 것이다. 그러나 나는 아직 그것을 보지 못했고, RabbitMQ의 사람들은 그 시나리오를 다루지 않는 것으로 보인다. 덕분에 다시 – jleach

+0

내 작품이 도움이되고 다행입니다! :) 여러 큐의 경우 단일 큐를 만들고이를 교환에 바인딩하는 것과 같은 방식으로 작동합니다. 1) 응용 프로그램 인스턴스 당 1 개의 RMQ 연결 만 있고 2) 각 소비자에 대해 새 채널을 사용하는 것이 좋습니다. 1 연결, 그 연결 내의 많은 채널. 연결 비용이 많이 들고 제한적입니다. 채널은 저렴하고 거의 무제한입니다. 모든 실제 작업은 채널에서 수행되며, 1 채널을 1 가지 전용으로 사용하는 것이 가장 쉽습니다. 도움이되는 희망! –