RabbitMQ. Część 2. Zgłębiamy temat Exchanges

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 procesem Erlang. 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 mnesia. 1 tysiąc wymienników będzie zużywać zaledwie 1 MB pamięci.

Spis treści

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:

RabbitMQ. Część 2. Zgłębiamy temat Exchanges

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ładnie 1 «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 przez 0 lub więcej słów

Graficzne przedstawienie przepływu wiadomości:

RabbitMQ. Część 2. Zgłębiamy temat Exchanges

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 implementacji trie, 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:

RabbitMQ. Część 2. Zgłębiamy temat Exchanges

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średnia lub wymiana typu fanout
  • wzory, które używają * jest znacznie szybsze, niż wzory, które używają #.
  • wymiany tematycznej wolniej wymiana bezpośrednia

Wymiana typu fanout

Wymiana typu fanoutwszystkie wiadomości są dostarczane do wszystkich kolejek nawet jeśli w wiadomości podany jest klucz routingu.

Cechy:

  • RabbitMQ nie działa z kluczami routingu i wzorami co pozytywnie wpływa na wydajność. To najszybszy exchange;
  • wszyscy odbiorcy powinni mieć możliwość przetwarzania wszystkich wiadomości;

Graficzne przedstawienie przepływu wiadomości:

RabbitMQ. Część 2. Zgłębiamy temat Exchanges

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:

RabbitMQ. Część 2. Zgłębiamy temat Exchanges

Cechy:

  • dodatkowa elastyczność
  • dodatkowe obciążenia związane z obliczeniami. Wszystkie pary (klucz, wartość) atrybutu nagłówki muszą być sortowane według nazwy klucza przed obliczeniem wartości kierowania wiadomości. Wolniejsze niż inne typy wymiany.

Wymiana Consistent-Hashing

Ta wymiana jest wtyczką 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:

RabbitMQ. Część 2. Zgłębiamy temat Exchanges

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:

RabbitMQ. Część 2. Zgłębiamy temat Exchanges

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 RabbitMQ.Client:

//...
channel.ExchangeDeclare(
    exchange: "my_exchange",
    type: "direct",
    durable: "false",
    autoDelete: "false",
    arguments: null
);
//...

  • exchange — nazwa wymiany, którą chcemy utworzyć. Nazwa musi być unikalna
  • type — typ wymiany
  • durable — jeśli ustawimy true, to exchange będzie trwała. Zostanie zapisana na dysku i przetrwa ponowne uruchomienie serwera/brokera. Jeśli wartość false, to exchange jest tymczasowa i zostanie usunięta, gdy serwer/broker zostanie uruchomiony ponownie
  • autoDelete — automatyczne usunięcie. Exchange zostanie usunięta, gdy wszystkie powiązane z nią kolejki zostaną usunięte
  • arguments — 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.

RabbitMQ. Część 2. Zgłębiamy temat Exchanges

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 OperationInterruptedException, 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:

RabbitMQ. Część 2. Zgłębiamy temat Exchanges

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ę trasowania 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

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster