Exchange — wymiennik lub punkt wymiany. Przesyłane są do niego wiadomości. Exchange rozdziela wiadomości do jednej lub kilku kolejek. On routuje wiadomości do kolejki na podstawie utworzonych powiązań (bindings) między nim a kolejką.
Exchange nie jest . Z powodów dotyczących skalowalności exchange — to łańcuch (odnośnik do modułu z kodem, gdzie znajduje się logika routingu) wbudowanej bazy danych . 1 tysiąc wymienników będzie zużywać zaledwie 1 MB pamięci.
Spis treści
- RabbitMQ. Część 3. Zrozumienie kolejek i powiązań
- RabbitMQ. Część 4. Zrozumienie, czym są wiadomości i ramki
- RabbitMQ. Część 5. Wydajność publikacji i konsumpcji wiadomości
- RabbitMQ. Część 6. Przegląd modułów Federation i Shovel
- RabbitMQ. Część 7. Szczegółowe informacje na temat połączenia i kanału
- RabbitMQ. Część 8. RabbitMQ w .NET
- RabbitMQ. Część 9. Monitorowanie
Wymiana bezpośrednia
Bezpośrednia wymiana — jest używana, gdy potrzeba dostarczyć wiadomość do określonych kolejek. Wiadomość jest publikowana w wymienniku z określonym kluczem routingu i trafia do wszystkich kolejek powiązanych z tym wymiennikiem tym samym kluczem routingu. Klucz routingu — to łańcuch. Dopasowanie odbywa się poprzez sprawdzenie łańcuchów pod względem równoważności.
Graficzne przedstawienie przepływu wiadomości:

W rabbitmq istnieje pojęcie wymiennika domyślnego. To wymiana bezpośrednia bez nazwy. Jeśli zostanie zastosowany wymiennik domyślny, wiadomość zostanie skierowana do kolejki o nazwie równej kluczowi routingu wiadomości.
Wymiana tematyczna
Wymiana tematyczna – podobnie wymiana bezpośrednia umożliwia selektywne routowanie poprzez porównanie klucza routingu. W tym przypadku klucz jest określany na podstawie wzoru. Podczas tworzenia wzoru używane są 0 lub więcej słów (litery AZ i az i cyfry 0-9), oddzielonych kropką, a także symbole * i #.
*— może być zastąpiony dokładnie1«replica» (na przykład funkcja snd_ctl_add_slave() została zastąpiona przez snd_ctl_add_replica()), co spowodowało#— może być zastąpiony przez0lub więcej słów
Graficzne przedstawienie przepływu wiadomości:

Zaczynając od wersji RabbitMQ 2.4.0 algorytm routingu dla wymiany tematycznej zaczął działać do 145 raz szybciej. Osiągnęli to, wprowadzając podejście , które polega na przedstawianiu wzorów w postaci struktury drzewa. Na przykład wzory a.b.c, a.*.b.c, a.#.c i b.b.c będą przedstawione w następującej strukturze:

Dopasowanie do wzoru odbywa się, zaczynając od korzenia i podążając w dół.
Cechy:
- zastosowanie tego wymiennika może być dobrym wyborem dla przyszłych rozwoju aplikacji, ponieważ wzory zawsze można skonfigurować tak, aby wiadomość była publikowana podobnie jak
wymiana bezpośrednialubwymiana typu fanout - wzory, które używają
*jest znacznie szybsze, niż wzory, które używają#. wymiany tematycznejwolniejwymiana bezpośrednia
Wymiana typu fanout
Wymiana typu fanout – wszystkie wiadomości są dostarczane do wszystkich kolejek nawet jeśli w wiadomości podany jest klucz routingu.
Cechy:
RabbitMQnie działa z kluczami routingu i wzorami co pozytywnie wpływa na wydajność. To najszybszyexchange;- wszyscy odbiorcy powinni mieć możliwość przetwarzania wszystkich wiadomości;
Graficzne przedstawienie przepływu wiadomości:

Wymiana nagłówków
Wymiana nagłówków — kieruje wiadomości do powiązanych kolejek na podstawie porównania par (klucz, wartość) właściwości nagłówki powiązania i podobnych właściwości wiadomości. nagłówki to Słownik<klucz, wartość>.
Jeśli do słownika dodany zostanie specjalny klucz x-match o wartości dowolny, to wiadomość jest kierowana przy częściowym dopasowaniu par (klucz, wartość). To zachowanie jest podobne do operatora lub.
var bindingArguments = new Dictionary<String, Object>();
bindingArguments.add("x-match", "any");Domyślnie klucz x-match zawiera wartość wszystko. Oznacza to, że wiadomość jest kierowana przy pełnym dopasowaniu par (klucz, wartość). To zachowanie jest podobne do operatora i.
Graficzne przedstawienie przepływu wiadomości:

Cechy:
- dodatkowa elastyczność
- dodatkowe obciążenia związane z obliczeniami. Wszystkie pary (klucz, wartość) atrybutu
nagłówkimuszą być sortowane według nazwy klucza przed obliczeniem wartości kierowania wiadomości. Wolniejsze niż inne typy wymiany.
Wymiana Consistent-Hashing
Ta wymiana jest i nie wbudowaną do RabbitMQ.
wymiana z hashemowanie consistent (wymiana z hashowanie consistent) – stosowana, gdy istnieje wiele kolejek, które mogą być potencjalnymi odbiorcami wiadomości, a kiedy potrzebne jest zrównoważenie obciążenia między nimi. Powiązanie wiadomości z kolejką odbywa się na podstawie wagi (warunkowa wartość ciągła od 0 - n).
Równoważna waga kolejek – wskazuje, że każda kolejka otrzyma z grubsza tę samą ilość wiadomości (każda wiadomość zostanie umieszczona tylko w jednej kolejce). Nie ma pełnej gwarancji równego rozkładu wiadomości.
Graficzne przedstawienie przepływu wiadomości:

Hash obliczany jest na podstawie klucza kierowania lub właściwości nagłówki wiadomości. Jeśli wszystkie publikowane wiadomości miały różne klucze kierowania lub nagłówki, to rozkład odbywa się na podstawie wagi. W przeciwnym razie zostanie użyty klucz kierowania lub nagłówki.
Powinien pomagać, gdy przepustowość odbiorcy wymaga zwiększenia większego niż rozwiązanie z wieloma odbiorcami korzystającymi z jednej kolejki.
Łączenie wymian (E2E)
Zachowanie wszystkich wymian można łączyć za pomocą połączenia Wymiana-do-wymiany (łączenie wymian nie jest zawarte w specyfikacji AMQP. To rozszerzenie protokołu po stronie RabbitMQ).
Graficzne przedstawienie przepływu wiadomości:

Dzięki E2E możemy znaleźć odpowiednią konfiguracyjną skalowalną, która spełnia zarówno obecne, jak i rosnące wymagania.
Tworzenie Exchange
Tworzenie wymiany odbywa się za pomocą synchronizacji RPC żądania do serwera. Żądanie jest realizowane przy użyciu metody Exchange.Declare, wywoływanej z parametrami:
- nazwa wymiany
- typ wymiany
- inne parametry
Przykład tworzenia exchange przy pomocy :
//...
channel.ExchangeDeclare(
exchange: "my_exchange",
type: "direct",
durable: "false",
autoDelete: "false",
arguments: null
);
//...exchange— nazwa wymiany, którą chcemy utworzyć. Nazwa musi być unikalnatype— typ wymianydurable— jeśli ustawimytrue, toexchangebędzie trwała. Zostanie zapisana na dysku i przetrwa ponowne uruchomienie serwera/brokera. Jeśli wartośćfalse, toexchangejest tymczasowa i zostanie usunięta, gdy serwer/broker zostanie uruchomiony ponownieautoDelete— automatyczne usunięcie.Exchangezostanie usunięta, gdy wszystkie powiązane z nią kolejki zostaną usuniętearguments— opcjonalne argumenty. Najczęściej poprzez argumenty ustawiane sąalternative exchange(alternatywna wymiana). Jeśli wiadomość nie może przejść przez pierwotną trasę, można ją wysłać do alternatywnej wymiany w celu przekierowania w inny sposób.

Jeśli tworzenie exchange być może, to serwer wyśle do klienta synchronizowane RPC odpowiedzi Exchange.DeclareOk. Jeśli stworzenie niemożliwe (wystąpił błąd w żądaniu Exchange.Declare), to kanał zostanie zamknięty przez serwer za pomocą asynchronicznego polecenia Channel.Close i klient otrzyma wyjątek , który będzie zawierał kod błędu i jego opis.
Wymiana musi być utworzona przed publikowaniem wiadomości. Jeśli opublikujesz wiadomość w nieistniejącej wymianie — RabbitMQ zostanie cicho usunięta.
Tworzenie Exchange za pomocą interfejsu graficznego
Zaloguj się do panelu administracyjnego RabbitMQ jako użytkownik gość (nazwa użytkownika: gość i hasło: gość). Zauważ, że użytkownik gość może łączyć się tylko z lokalnego hosta. Teraz przejdź do zakładki Wymiany i kliknij na Add a new exchange. Wypełnij właściwości:

Większość właściwości została opisana powyżej. Tutaj zaznaczymy, że jeśli ustalisz Wewnętrzny, wymiana może być używana tylko dla E2E. Producent nie będzie mogła wysyłać wiadomości do takiej wymiany.
Podsumowanie
Podczas projektowania systemu wygodnie jest opisywać topologię za pomocą grafu. Ale zanim zaczniesz budować graf, warto wyodrębnić ścieżki o dużym ruchu, ponieważ to one wymagają wyższej przepustowości (wydajności). Następnie można sklasyfikować ruch. A dopiero potem przystąpić do budowy.
Jeśli w zbudowanej grafie istnieje skończony zbiór kluczy routingu, warto rozważyć kilka wymiana typu fanout, które są 1:1 powiązane z kluczem routingu. Pamiętajmy, że wymiana typu fanout jest najszybszy.
Jeśli liczba tras dąży do nieskończoności, warto zwrócić uwagę na wymiany tematycznej lub, jeśli szablon nie jest potrzebny, można wybrać direct exchange, ponieważ jest szybszy. wymiany tematycznej.
Kombinacje różnych exchange powinny pomóc znaleźć właściwą skalowalną konfigurację, która spełnia zarówno bieżące, jak i rosnące wymagania systemu.
Liczba exchange i kolejek powinno być minimalnie w porównaniu do liczby tras.
W następnym artykule zaczniemy dokładniej omawiać Queues i Bindings.
Linki
Źródło: habr.com
