2012-03-14 25 views
36

Mamy aplikację, która będzie używała RabbitMQ i ma kilka różnych kolejek do przekazywania wiadomości między poziomami.Wymiana tematów a bezpośrednia wymiana w RabbitMQ

Początkowo planowałem użyć wielu bezpośrednich wymian, z których jedna dla każdego typu komunikatu, ale wygląda na to, że posiadanie jednej wymiany tematów z kolejkami przy użyciu różnych wiązań klawiszy spowoduje osiągnięcie tego samego.

Posiadanie pojedynczej giełdy również wydaje się być nieco łatwiejsze w utrzymaniu, ale zastanawiałem się, czy istnieje jakakolwiek korzyść (jeśli w ogóle) z robienia tego w jedną stronę z drugą?

opcji 1, przy użyciu wielu bezpośrednia wymiana:

ExchangeA (type: direct) 
-QueueA 

ExchangeB (type: direct) 
-QueueB 

ExchangeC (type: direct) 
-QueueC 

Wariant 2, wykorzystując pojedynczą wymianę Wątek:

Exchange (type: topic) 
-QueueA (receives messages from exchange with routing key of "TypeA") 
-QueueB (receives messages from exchange with routing key of "TypeB") 
-QueueC (receives messages from exchange with routing key of "TypeC") 

Odpowiedz

29

Zakładając oba modele są uważane być realizowane za pomocą jednego biegu do pośrednika, jest mało różnica, którą widzę.

Opcja 2 wydaje się bardziej powszechna w świecie rzeczywistym, jeśli chodzi o rozwiązywanie tego rodzaju problemów z routingiem (przynajmniej w moim anegdotycznym doświadczeniu) i jest to dokładnie wyzwanie, które istnieją w Topic Exchanges.

Jedyna różnica, którą możesz napotkać, dotyczy szybkości rutowania. Nie wiem na pewno, czy routing Exchange (oparty zawsze na dokładnym dopasowywaniu ciągów znaków) jest szybszy w RabbitMQ w porównaniu z techniką klucza routingu używanego w wymianach tematycznych (które mogą obejmować symbole wieloznaczne, takie jak # i *). Moje przypuszczenie byłoby takie, że dyskryminacja w Exchange byłaby szybsza, ale możesz poeksperymentować samemu, aby się tego dowiedzieć, lub spróbować skontaktować się z zespołem RabbitMQ, aby go zapytać.

W końcu, jeśli wybierzesz opcję 1 z mnóstwem kolejek, będziesz miał proporcjonalną prolongatę wymiany. To brzmi jak ból głowy związany z utrzymaniem. Jeśli będziesz mieć tylko garstkę kolejek, to nie będzie to zbyt duży problem.

+2

Zgadzam się. Wiele kolejek z odpowiednimi klawiszami routingu jest znacznie łatwiejszych w zarządzaniu. Jedyną zaletą opcji 1, która przychodzi na myśl, jest to, że wiele central może być hostowanych na oddzielnym sprzęcie, tym samym uzyskując pionowe skalowanie. Jeśli jednak twój sprzęt będzie się skalał, możesz nigdy nie potrzebować tej trasy. –

+0

Myślę, że zaletą używania tematu jest to, że jeśli w przyszłości będziesz musiał wysłać tę samą wiadomość do wielu kolejek w swojej giełdzie, twoja opcja 2 byłaby bardziej pożądana. – gigi2

3

Dla pojedynczego małego węzła przy małym obciążeniu jest niewielka różnica. Większość ludzi wybiera opcję drugą z wymienionych powyżej powodów.

Podczas projektowania systemu powinieneś zadać sobie pytanie, w jaki sposób może to rozszerzyć się w przyszłości.

Jak to będzie skalować?
Czy potrzebuję go do skalowania? Czy chcę dodać klaster wysokiej dostępności w przyszłości? Czy zmieni się moja trasa ...

Opcja 2 zapewnia o wiele większą elastyczność w większości przypadków.

Umożliwia to np. Dołączenie nowego klienta do Exchange za pomocą własnej kolejki i łatwe przechwycenie dowolnego podzbioru lub całego strumienia wiadomości. (te kolejki mogą znajdować się na innych węzłach w klastrze lub odzwierciedlone w węzłach zapewniających przełączanie awaryjne) Typowym przykładem użycia byłoby logowanie wszystkich wiadomości za pomocą czwartej kolejki.

Jeśli twoje wąskie gardło pojawia się po stronie przetwarzania, możesz dalej dzielić tematy swoich wiadomości i ustalać priorytety bez konieczności zmiany wydawców. Przykład: ToppicA.urgent, przetworzony przez dedykowanego konsumenta, TopicA.log ostatecznie przetworzony.

Krótka odpowiedź brzmi z opcją 2, chyba że masz bardzo szczegółowe wymagania dotyczące wydajności, Jeśli na przykład musisz przetworzyć, powiedzmy, że ciągła stopa przekracza 50k msg/s, możesz pomyśleć o opcji 1 na dedykowanych węzłach, ale dla normalnych przepływów opcja 2 będzie łatwiejsza do skalowania i utrzymywania.

4

Rzeczywiście, podejście 2 jest lepsze, ponieważ zapewnia elastyczność korzystania z pojedynczej kolejki dla wielu kluczy routingu.

Exchange Temat

QueueA-- binding key = India.Karnataka.* 

Można trasa wiadomość do wymiany tematu z kluczem routingu jako India.Karnataka.bangalore, India.Karnataka.Mysore.

Wszystkie powyższe wiadomości trafiają do QueueA.

bezpośredniej wymiany

Ale nie rozumiem, dlaczego ty tworzenia wielu bezpośredniej wymiany w podejściu 1. Możesz mieć jeden bezpośredniej wymiany i mieć wielu kolejek z każdego wiązania z unikalnym kluczem kolejce.

QueueA-- binding key = Key1 
QueueB-- binding Key = Key2 
QueueC-- binding Key = Key3 

Wszystkie wiadomości z kluczem 1 przechodzą do kolejkiA.Key2 przechodzi do kolejkiB ... Można nadal prowadzić jedną bezpośrednią wymianę.