KrólikMQ. Część 2. Zrozumienie giełd

Exchange — kantor wymiany walut. Wiadomości są do niego wysyłane. Exchange rozpowszechnia wiadomość w jednej lub kilku kolejkach. On kieruje wiadomości do kolejki na podstawie utworzonych linków (bindings) między nim a kolejką.

Exchange nie jest Proces Erlanga. Ze względu na skalowalność exchange — jest to ciąg (link do modułu z kodem, w którym znajduje się logika routingu) w bazie danych wbudowanej mnezja. 1 wymienników będzie zużywać zaledwie 1 MB pamięci.

Spis treści

  • KrólikMQ. Część 1. Wprowadzenie. Erlang, AMQP i RPC
  • KrólikMQ. Część 2. Zrozumienie giełd
  • KrólikMQ. Część 3. Zrozumienie kolejek i powiązań
  • KrólikMQ. Część 4. Zrozumienie, czym są wiadomości i ramki
  • KrólikMQ. Część 5: Wydajność publikowania i wykorzystywania wiadomości
  • KrólikMQ. Część 6. Omówienie modułów Federacji i Łopaty
  • KrólikMQ. Część 7. Szczegóły dotyczące Connection i Chanel
  • KrólikMQ. Część 8. RabbitMQ w .NET
  • KrólikMQ. Część 9. Monitorowanie

Bezpośrednia wymiana

Direct exchange - używane w razie konieczności dostarczać wiadomość do określonych kolejek. Wiadomość jest publikowana w giełdzie z pewnym klucz do routingu i dostaje się do wszystkich kolejek podłączonych do tego wymiennika za pomocą podobnego klucza routingu. Klucz routingu jest ciągiem znaków. Wyszukiwanie dopasowania odbywa się za pomocą sprawdź równość ciągów.

Graficzna reprezentacja przepływu wiadomości:

KrólikMQ. Część 2. Zrozumienie giełd

В rabbitmq jest koncepcja domyślny wymiennik. To direct exchange bez nazwy. Jeżeli używany jest domyślny wymiennik, wiadomość zostanie skierowana do kolejki o nazwie równej klucz do kierowania wiadomościami.

Wymiana tematów

Topic exchange - podobnie direct exchange umożliwia selektywne trasowanie poprzez porównanie klucza trasowania. Ale w tym przypadku klucz jest podany według szablonu. Podczas tworzenia szablonu używane są następujące elementy: 0 lub więcej słów (liter AZ и az i liczby 0-9), oddzielone kropką, a także symbole * и #.

  • * - można zastąpić dokładnie 1 слово
  • # — można zastąpić przez 0 lub więcej słów

Graficzna reprezentacja przepływu wiadomości:

KrólikMQ. Część 2. Zrozumienie giełd

Od wersji RabbitMQ 2.4.0 algorytm routingu dla topic exchange zaczął pracować wcześniej 145 razy szybciej. Udało im się to osiągnąć dzięki wdrożeniu podejścia implementacja trie, co oznacza reprezentowanie szablonów jako struktury drzewiastej. Na przykład szablony a.b.c, a.*.b.c, a.#.c и b.b.c będzie reprezentowana przez następującą strukturę:

KrólikMQ. Część 2. Zrozumienie giełd

Poszukiwanie pasującego wzorca rozpoczyna się od korzenia i przebiega od góry do dołu.

Cechy:

  • korzystanie z tego wymiennika może stać się dobry wybór pod kątem możliwego przyszłego rozwoju aplikacjiponieważ szablony można zawsze dostosować, aby wiadomość była publikowana w ten sam sposób direct exchange lub fanout exchange
  • szablony, które wykorzystują * o wiele szybciejniż szablony, które używają #.
  • topic exchange wolniej direct exchange

Wymiana Fanoutów

Fanout exchange - wszystkie wiadomości są dostarczane do wszystkich kolejek nawet jeśli w wiadomości określono klucz routingu.

Cechy:

  • RabbitMQ nie działa z klawiszami routingu i szablonami co ma pozytywny wpływ na produktywność. To jest najszybsze exchange;
  • wszyscy konsumenci muszą być w stanie przetworzyć wszystkie wiadomości;

Graficzna reprezentacja przepływu wiadomości:

KrólikMQ. Część 2. Zrozumienie giełd

Wymiana nagłówków

Headers exchange - kieruje wiadomości do powiązanych kolejek na podstawie porównania par właściwości (klucz, wartość) headers powiązania i podobne właściwości wiadomości. headers jest a Dictionary<ключ, значение>.

Jeśli dodasz klucz specjalny do słownika x-match ze znaczeniem any, wówczas wiadomość jest kierowana, jeśli istnieje częściowe dopasowanie par (klucz, wartość). To zachowanie jest podobne do operatora or.

var bindingArguments = new Dictinary<String, Object>();
bindingArguments.add("x-match", "any");

Klucz domyślny x-match zawiera znaczenie all. Oznacza to, że wiadomość zostanie przesłana, jeśli pary (klucz, wartość) dokładnie pasują do siebie. To zachowanie jest podobne do operatora and.

Graficzna reprezentacja przepływu wiadomości:

KrólikMQ. Część 2. Zrozumienie giełd

Cechy:

  • dodatkowa elastyczność
  • dodatkowe obciążenie obliczeniowe. Wszystkie pary (klucz, wartość) atrybutu headers muszą zostać posortowane według nazwy klucza przed obliczeniem wartości routingu wiadomości. Wolniejszy niż inne typy giełd.

Spójna wymiana haszująca

Ten wymiennik jest podłącz и nie wbudowany в RabbitMQ.

Consistent-hashing exchange (wymiana ze spójnym haszowaniem) – stosowana, gdy istnieje kilka kolejek będących potencjalnymi odbiorcami wiadomości i gdy konieczne jest zrównoważenie obciążenia między nimi. Wiadomość jest skojarzona z kolejką według wagi (wartość warunkowa ciągu z 0 - n).

Równoważna waga kolejek – mówi, że w każdej kolejce będzie mniej więcej taka sama kwota wiadomości (każda wiadomość zostanie umieszczona tylko w jednej kolejce). Nie ma całkowitej gwarancji równomiernej dystrybucji wiadomości..

Graficzna reprezentacja przepływu wiadomości:

KrólikMQ. Część 2. Zrozumienie giełd

Hash obliczone na podstawie klucza routingu lub właściwości headers wiadomości. Gdyby wszystkie opublikowane wiadomości miały różne klucze routingu lub headers, wówczas rozkład będzie odbywał się według wagi. W przeciwnym wypadku zostanie użyty klucz routingu lub headers.

Powinno być pomocne, gdy przepustowość konsumentów musi być większa niż w przypadku rozwiązania z wieloma konsumentami korzystającymi z jednej kolejki.

Łączenie wymienników (E2E)

Zachowanie wszystkich wymienników można połączyć za pomocą połączenia Giełda-giełda (specyfikacja nie uwzględnia połączenia wymienników) AMQP. Jest to rozszerzenie protokołu z boku RabbitMQ).

Graficzna reprezentacja przepływu wiadomości:

KrólikMQ. Część 2. Zrozumienie giełd

Kosztem E2E możemy znaleźć odpowiednią, skalowalną konfigurację, która spełni zarówno obecne, jak i rosnące wymagania.

Tworzenie giełdy

Tworzenie wymiennika odbywa się metodą synchroniczną RPC żądanie do serwera. Żądanie jest składane za pomocą metody Exchange.Declare, wywołane z parametrami:

  • nazwa wymieniającego
  • typ wymiennika
  • inne opcje

Przykład stworzenia exchange za pomocą Klient RabbitMQ:

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

  • exchange — nazwa giełdy, którą chcemy utworzyć. Nazwa musi być unikalna.
  • type — typ wymiennika
  • durable - jeśli zainstalujesz truenastępnie exchange będzie trwałe. Informacje zostaną zapisane na dysku i przetrwają ponowne uruchomienie serwera/brokera. Jeśli wartość falsenastępnie exchange jest tymczasowy i zostanie usunięty po ponownym uruchomieniu serwera/brokera
  • autoDelete - automatyczne usuwanie. Exchange zostanie usunięty po usunięciu wszystkich kolejek z nim powiązanych
  • arguments — argumenty opcjonalne. Najczęściej są one zadawane za pomocą argumentów alternative exchange (alternatywny wymiennik). Jeżeli wiadomość nie może zostać przesłana pierwotną trasą, może zostać wysłana do alternatywnego wymiennika, który prześle ją inną ścieżką.

KrólikMQ. Część 2. Zrozumienie giełd

Jeśli stworzenie exchange być może, następnie serwer wyśle ​​synchroniczną wiadomość do klienta RPC odpowiedź Exchange.DeclareOk. Jeśli stworzenie jest niemożliwe (prośba została odrzucona Exchange.Declare) następnie kanał zostanie zamknięty serwer używający polecenia asynchronicznego Channel.Close a klient otrzyma wyjątek Wyjątek przerwania operacji, który będzie zawierał kod błędu i jego opis.

Przed wysłaniem wiadomości należy utworzyć giełdę. Jeśli wyślesz wiadomość do nieistniejącego kantoru – RabbitMQ usuniemy je po cichu.

Tworzenie Exchange za pomocą GUI

Przejdź do panelu administracyjnego RabbitMQ pod użytkownikiem guest (nazwa użytkownika: guest i hasło: guest). Należy pamiętać, że użytkownik guest można połączyć się tylko z localhosta. Przejdźmy teraz do zakładki Exchanges i kliknij Add a new exchange. Wypełnij właściwości:

KrólikMQ. Część 2. Zrozumienie giełd

Większość właściwości została opisana powyżej. Tutaj zauważamy, że jeśli zapytamy Internal, wówczas wymiana może być wykorzystana wyłącznie E2E. Producer nie będzie mógł wysyłać wiadomości do takiej giełdy.

wniosek

Przy opracowywaniu systemu wygodnie jest opisać topologię rozgromienie za pomocą wykresu. Ale zanim zaczniesz budować wykres, warto wyróżnić ścieżki o dużym natężeniu ruchu, bo to one tego wymagają większa przepustowość (wydajność). Następnie możesz klasyfikować ruch. I dopiero wtedy można rozpocząć budowę.

Jeżeli skonstruowany graf zawiera zbiór skończony klucze trasujące, warto przyjrzeć się kilku fanout exchange, które są w stosunku 1:1 do klucza routingu. Pamiętaj, że fanout exchange najszybszy.

Jeśli liczba tras dąży do nieskończoności, to warto zwrócić na to uwagę topic exchange lub jeśli szablon nie jest potrzebny, możesz wybrać direct exchngeponieważ jest szybszy topic exchange.

Kombinacje różnych exchange powinno pomóc znaleźć ten właściwy skalowalna konfiguracja, który spełnia zarówno obecne, jak i rosnące wymagania systemowe.

Liczba exchange a kolejek powinno być jak najmniej w stosunku do liczby tras.

W następnym artykule zaczniemy dokładniej omawiać zagadnienie kolejek i powiązań.

referencje

Źródło: www.habr.com

Dodaj komentarz