Część 4: Giełdy RabbitMQ, klucze routingu i wiązania

Co to jest giełda? Co to są klucze routingu i wiązania? Jak wymiany i kolejki są powiązane ze sobą? Kiedy należy ich używać i w jaki sposób? Ten artykuł wyjaśnia różne typy wymiany w RabbitMQ oraz scenariusze jak z nich korzystać.

Wiadomości nie są publikowane bezpośrednio do kolejki. Zamiast tego, producent wysyła wiadomości do wymiany. Giełdy są agentami routingu wiadomości, zdefiniowanymi przez wirtualnego hosta w ramach RabbitMQ. Wymiana jest odpowiedzialna za kierowanie wiadomości do różnych kolejek za pomocą atrybutów nagłówka, powiązań i kluczy routingu.

Wiązanie jest „linkiem”, który ustawiasz aby powiązać kolejkę z wymianą.

Klucz routingu to atrybut wiadomości, na który patrzy giełda decydując jak skierować wiadomość do kolejek (w zależności od typu giełdy).

Wymienniki, połączenia i kolejki mogą być skonfigurowane z parametrami takimi jak trwałe, tymczasowe i automatyczne usuwanie po utworzeniu. Trwałe wymiany przetrwają restarty serwera i trwają do momentu ich jawnego usunięcia. Wymiany tymczasowe istnieją do momentu wyłączenia RabbitMQ. Automatyczne usuwanie jest usuwane, gdy ostatni związany obiekt zostanie usunięty z wymiany.

W RabbitMQ istnieją cztery różne typy wymian, które kierują wiadomości w różny sposób, używając różnych parametrów i ustawień wiązań. Klienci mogą tworzyć własne giełdy lub korzystać z predefiniowanych giełd domyślnych, które są tworzone przy pierwszym uruchomieniu serwera.

  1. Producent publikuje wiadomość do giełdy.
  2. Giełda otrzymuje wiadomość i jest teraz odpowiedzialna za routing wiadomości.
  3. Bindowanie musi być ustawione pomiędzy kolejką a giełdą. W tym przypadku mamy powiązania do dwóch różnych kolejek z giełdy. Giełda kieruje wiadomość do kolejek.
  4. Wiadomości pozostają w kolejce dopóki nie zostaną obsłużone przez konsumenta.
  5. Konsument obsługuje wiadomość.

Jeśli nie jesteś zaznajomiony z RabbitMQ i kolejkowaniem wiadomości, przeczytajRabbitMQ dla początkujących – czym jest RabbitMQ?zanim przeczytasz o wymianach, kluczach routingu, nagłówkach i wiązaniach.

Wymiana bezpośrednia

Wymiana bezpośrednia dostarcza wiadomości do kolejek w oparciu o klucz routingu wiadomości. Klucz routingu jest atrybutem wiadomości dodawanym do nagłówka wiadomości przez producenta. Wiadomość trafia do kolejki (kolejek) z kluczem wiążącym, który dokładnie odpowiada kluczowi routingu wiadomości.

Typ wymiany bezpośredniej jest użyteczny do rozróżniania wiadomości publikowanych do tej samej wymiany przy użyciu prostego identyfikatora łańcuchowego.

Domyślna wymiana, którą brokerzy AMQP muszą zapewnić dla wymiany bezpośredniej to „amq.direct”.

Wyobraźmy sobie, że kolejka A (create_pdf_queue) na poniższym obrazku (rysunek wymiany bezpośredniej) jest związana z wymianą bezpośrednią (pdf_events) z kluczem wiążącympdf_create.Kiedy nowa wiadomość z kluczem routingupdf_create dociera do bezpośredniej wymiany, wymiana kieruje ją do kolejki, w którejbinding_key = routing_key, w tym przypadku do kolejki A (create_pdf_queue).

Scenariusz 1

  • Wymiana: pdf_events
  • Kolejka A: create_pdf_queue
  • Klucz wiążący między wymianą (pdf_events) a kolejką A (create_pdf_queue): pdf_create

Scenariusz 2

  • Wymiana: pdf_events
  • Kolejka B: pdf_log_queue
  • Klucz wiążący pomiędzy wymianą (pdf_events) a kolejką B (pdf_log_queue): pdf_log

Przykład

Przykład: A message with routing keypdf_logis sent to the exchangepdf_events.The messages is routed to pdf_log_queue because the routing key (pdf_log) matches thebinding key (pdf_log).

If the message routing key does not match any binding key, the message is discarded.

Direct Exchange: Komunikat trafia do kolejek, których klucz wiążący dokładnie odpowiada kluczowi routingu komunikatu.

Wymiana domyślna

Wymiana domyślna to zadeklarowana wcześniej wymiana bezpośrednia bez nazwy, określana zwykle pustym łańcuchem. Kiedy używasz wymiany domyślnej, wiadomość jest dostarczana do kolejki o nazwie równej kluczowi routingu wiadomości. Każda kolejka jest automatycznie przypisana do domyślnej wymiany z kluczem routingu, który jest taki sam jak nazwa kolejki.

Wymiana tematyczna

Wymiana tematyczna kieruje wiadomości do kolejek na podstawie dopasowania wieloznacznego pomiędzy kluczem routingu a wzorcem routingu, który jest określony przez przypisanie do kolejki. Wiadomości są kierowane do jednej lub wielu kolejek na podstawie dopasowania między kluczem routingu wiadomości a tym wzorcem.

Klucz routingu musi być listą słów, ograniczonych kropką (.). Przykładami sąagreements.us iagreements.eu.stockholm, które w tym przypadku identyfikują umowy ustanowione dla firmy posiadającej biura w wielu różnych lokalizacjach. Wzorce routingu mogą zawierać gwiazdkę („*”), aby dopasować słowo w określonej pozycji klucza routingu (np. wzorzec routingu „agreements.*.*.b.*” dopasowuje tylko klucze routingu, w których pierwszym słowem jest „agreements”, a czwartym słowem „b”). Symbol funta („#”) wskazuje na dopasowanie zera lub więcej słów (np. wzorzec routingu „agreements.eu.berlin.#” pasuje do wszystkich kluczy routingu zaczynających się od „agreements.eu.berlin”).

Konsumenci wskazują, które tematy ich interesują (np. subskrypcja kanału dla indywidualnego tagu). Konsument tworzy kolejkę i ustawia wiązanie z podanym wzorcem routingu do wymiany. Wszystkie wiadomości z kluczem routingu, które pasują do wzorca routingu są kierowane do kolejki i pozostają tam dopóki konsument nie skonsumuje wiadomości.

Domyślna wymiana, którą brokerzy AMQP muszą zapewnić dla wymiany tematów to „amq.topic”.

Scenariusz 1

Obraz po prawej stronie pokazuje przykład, w którym konsument A jest zainteresowany wszystkimi umowami w Berlinie.

  • Exchange: agreements
  • Queue A: berlin_agreements
  • Routing pattern between exchange (agreements) and Queue A (berlin_agreements): agreements.eu.berlin.#
  • Przykład klucza routingu wiadomości, który pasuje do: agreements.eu.berlin i agreements.eu.berlin.headstore

Scenariusz 2

Konsument B jest zainteresowany wszystkimi umowami.

  • Wymiana: umowy
  • Kolejka B: wszystkie_umowy
  • Routing pattern pomiędzy wymianą (umowy) a kolejką B (wszystkie_umowy): umowy.#
  • Przykładowy klucz routingu wiadomości, który pasuje: agreements.eu.berlin i agreements.us

Wymiana tematyczna: Komunikaty są kierowane do jednej lub wielu kolejek na podstawie dopasowania klucza routingu komunikatów do wzorca routingu.

Scenariusz 3

Konsument C jest zainteresowany wszystkimi umowami dla europejskich central.

  • Exchange: agreements
  • Queue C: headstore_agreements
  • Routing pattern between exchange (agreements) and Queue C (headstore_agreements): agreements.eu.*.headstore
  • Przykładowe klucze routingu wiadomości, które będą pasować: agreements.eu.berlin.headstore i agreements.eu.stockholm.headstore

Przykład

Komunikat z kluczem routinguagreements.Wiadomości są kierowane do kolejkiberlin_agreements, ponieważ wzór routingu „agreements.eu.berlin.#” pasuje do kluczy routingu zaczynających się od „agreements.eu.berlin”. Wiadomość jest również kierowana do kolejkiall_agreements ponieważ klucz routingu (agreements.eu.berlin) pasuje do wzorca routingu (agreements.#).

Wymiana fanout

Wymiana fanout kopiuje i kieruje otrzymaną wiadomość do wszystkich kolejek, które są do niej przypisane niezależnie od kluczy routingu lub dopasowania wzorca, tak jak w przypadku wymiany bezpośredniej i tematycznej. Podane klucze zostaną po prostu zignorowane.

Wymiana fanout może być użyteczna, gdy ta sama wiadomość musi być wysłana do jednej lub więcej kolejek z konsumentami, którzy mogą przetwarzać tę samą wiadomość na różne sposoby.

Obraz po prawej (Wymiana Fanout) pokazuje przykład, gdzie wiadomość otrzymana przez wymianę jest kopiowana i kierowana do wszystkich trzech kolejek powiązanych z wymianą. Może to być na przykład sport lub aktualizacja pogody, które powinny być wysyłane do każdego podłączonego urządzenia mobilnego, gdy coś się wydarzy.

Domyślna wymiana, którą brokerzy AMQP muszą zapewnić dla wymiany tematycznej to „amq.fanout”.

Wymiana Fanout: Odebrana wiadomość jest kierowana do wszystkich kolejek, które są związane z wymianą.

Scenariusz 1

  • Wymiana: sport_news
  • Kolejka A: Kolejka klienta mobilnego A
  • Wiązanie: Binding pomiędzy giełdą (sport_news) a kolejką A (kolejka klienta mobilnego A)

Przykład

Wiadomość jest wysyłana do giełdyport_news.Wiadomość jest kierowana do wszystkich kolejek (kolejka A, kolejka B, kolejka C), ponieważ wszystkie kolejki są związane z giełdą. Podane klucze routingu są ignorowane.

Wymiana nagłówków

Wymiana nagłówków kieruje wiadomości na podstawie argumentów zawierających nagłówki i wartości opcjonalne. Wymiana nagłówków jest bardzo podobna do wymiany tematów, ale kieruje wiadomości na podstawie wartości nagłówków zamiast kluczy routingu. Wiadomość pasuje, jeśli wartość nagłówka jest równa wartości określonej podczas wiązania.

Specjalny argument o nazwie „x-match”, dodany w wiązaniu pomiędzy wymianą a kolejką, określa czy wszystkie nagłówki muszą pasować, czy tylko jeden. Albo jakikolwiek wspólny nagłówek pomiędzy komunikatem a wiązaniem liczy się jako dopasowanie, albo wszystkie nagłówki, do których odwołuje się wiązanie muszą być obecne w komunikacie, aby został on dopasowany. Właściwość „x-match” może mieć dwie różne wartości: „any” lub „all”, gdzie „all” jest wartością domyślną. Wartość „all” oznacza, że wszystkie pary nagłówków (klucz, wartość) muszą się zgadzać, podczas gdy wartość „any” oznacza, że przynajmniej jedna z par nagłówków musi się zgadzać. Nagłówki mogą być skonstruowane przy użyciu szerszego zakresu typów danych, na przykład liczb całkowitych lub hash, zamiast łańcucha. Typ wymiany nagłówków (używany z argumentem wiążącym „any”) jest przydatny do kierowania wiadomości, które zawierają podzbiór znanych (nieuporządkowanych) kryteriów.

Domyślną wymianą, jaką brokerzy AMQP muszą zapewnić dla wymiany tematów, jest „amq.headers”.

Przykład

Scenariusz 3

Wiadomość 3 jest publikowana do wymiany z argumentami nagłówków o (klucz = wartość): „format = zip”, „typ = log”.

Warto zauważyć, że w wymianie nagłówkowej rzeczywista kolejność par klucz-wartość w wiadomości nie ma znaczenia.

Dead Letter Exchange

Jeśli dla wiadomości nie można znaleźć pasującej kolejki, wiadomość jest po cichu porzucana. RabbitMQ dostarcza rozszerzenie AMQP znane jako „Dead Letter Exchange”, które zapewnia funkcjonalność przechwytywania wiadomości, które nie są możliwe do dostarczenia.

Proszę napisz do nas [email protected] masz jakieś sugestie dotyczące brakującej zawartości lub inne opinie.

Poradnik – RabbitMQ dla początkujących

Podobał Ci się ten artykuł? Nie zapomnij podzielić się nim z innymi 😉

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.