RabbitMQ. Част 2. Разглеждаме Exchanges

Обмен — обменник или точка обмена. В него отправляются сообщения. Обмен разпределя съобщението в една или повече опашки. Той маршрутизира съобщения в опашка на базата на създадените връзки (bindings) между него и опашката.

Обмен не е Erlang процес.. По отношение на мащабируемостта exchange — това е строка (връзка към модул с кода, където се намира логиката на маршрутизация) във вградената база данни mnesia. 1000 обменника ще консумират само 1MB памет.

Съдържание

  • RabbitMQ. Част 1. Въведение. Erlang, AMQP и RPC
  • RabbitMQ. Част 2. Разглеждаме Exchanges
  • RabbitMQ. Част 3. Разбиране на Queues и Bindings
  • RabbitMQ. Част 4. Разглеждаме какво представляват съобщенията и фреймовете
  • RabbitMQ. Част 5. Производителност на публикуване и потребление на съобщения
  • RabbitMQ. Част 6. Преглед на модулите Federation и Shovel
  • RabbitMQ. Част 7. Подробно за Connection и Chanel
  • RabbitMQ. Част 8. RabbitMQ в .NET
  • RabbitMQ. Част 9. Мониторинг

Директен обмен

Директен обмен — се използва, когато е необходимо да се достави съобщение до определени опашки. Съобщението се публикува в обменника с определен маршрутизационен ключ и попада във всички опашки, които са свързани с този обменник с аналогичен маршрутизационен ключ. Маршрутизационният ключ е строка. Търсенето на съответствие става чрез проверка на стрингове за равенство.

Графично представяне на потока от съобщения:

RabbitMQ. Част 2. Разглеждаме Exchanges

В rabbitmq се използва понятието обменник по подразбиране. Това е директен обмен без име. Ако се използва обменник по подразбиране, съобщението ще бъде маршрутизирано в опашката с име, равно на маршрутизационния ключ на съобщението.

Топик обмен

Топик обмен – аналогично директен обмен дава възможност за селективна маршрутизация чрез сравнение на маршрутизационния ключ. Но в този случай ключът се задава по шаблон.. При създаването на шаблона се използват 0 или повече думи (букви AZ и аз и цифри 0-9), разделени с точка, както и символи * и #.

  • * — може да бъде заменен с точно 1 думата
  • # — може да бъде заменен с 0 или повече думи

Графично представяне на потока от съобщения:

RabbitMQ. Част 2. Разглеждаме Exchanges

Започвайки от версия RabbitMQ 2.4.0 алгоритъмът за маршрутизиране за топик обмен започна да работи до 145 раз два пъти по-бързо. Постигнаха го чрез внедряване на подхода trie implementation, който предполага представяне на шаблоните под формата на дървовидна структура. Например шаблоните a.b.c, a.*.b.c, a.#.c и b.b.c ще бъдат представени следната структура:

RabbitMQ. Част 2. Разглеждаме Exchanges

Търсенето на съответствие на шаблона започва от корена и следва отгоре надолу.

Характеристики:

  • използването на този обменник може да бъде добър избор за възможно бъдещо развитие на приложението, тъй като шаблоните винаги могат да бъдат настроени така, че съобщението да бъде публикувано аналогично директен обмен или fanout exchange
  • шаблони, които използват * е значително по-бързо, в сравнение с шаблони, които използват #.
  • топик обмен по-бавно директен обмен

Fanout Exchange

Fanout обменвсички съобщения се доставят във всички опашки дори ако в съобщението е зададен маршрутизационен ключ.

Характеристики:

  • RabbitMQ не работи с маршрутизационни ключове и шаблони което положително влияе на производителността. Това е най-бързият exchange;
  • всички потребители трябва да имат възможност да обработват всички съобщения;

Графично представяне на потока от съобщения:

RabbitMQ. Част 2. Разглеждаме Exchanges

Обмен на хедъри

Обмен на хедъри — насочва съобщения към свързани опашки на базата на сравнение на двойки (ключ, стойност) на свойството хедъри прикрепяния и аналогично свойство на съобщението. хедъри представлява Dictionary<ключ, стойност>.

Ако в речника добавите специален ключ x-match с стойността всяко, то съобщението се маршрутизира при частично съвпадение на двойките (ключ, стойност). Това поведение е аналогично на оператора или.

var bindingArguments = new Dictionary<String, Object>();
bindingArguments.add("x-match", "всяко");

По подразбиране ключът x-match съдържа стойност всички. Това означава, че съобщението се маршрутизира при пълно съвпадение на двойките (ключ, стойност). Това поведение е аналогично на оператора и.

Графично представяне на потока от съобщения:

RabbitMQ. Част 2. Разглеждаме Exchanges

Характеристики:

  • допълнителна гъвкавост
  • допълнителни разходи за изчисление. Всички двойки (ключ, стойност) на атрибута хедъри трябва да бъдат сортирани по името на ключа преди изчисляването на стойностите за маршрутизиране на съобщението. По-бавно от другите типове обмен.

Consistent-Hashing Exchange

Този обменник е плъгин и не вграден в RabbitMQ.

Consistent-hashing exchange (обмен с последователно хеширане) – се използва, когато има няколко опашки, които са потенциални получатели на съобщението, и когато е необходимо да се балансира натоварването между тях. Свързването на съобщението с опашката се извършва по тегло (условна стринг стойност от 0 - n).

Равностойно тегло на опашките – показва, че в всяка опашка ще пристигне приблизително равен брой съобщения (всяко съобщение ще бъде поставено само в една опашка). Няма пълна гаранция за равномерно разпределение на съобщенията.

Графично представяне на потока от съобщения:

RabbitMQ. Част 2. Разглеждаме Exchanges

Hash се изчислява на базата на ключа за маршрутизиране или свойството хедъри на съобщението. Ако всички публикувани съобщения имат различни ключове за маршрутизиране или хедъри, то разпределението ще бъде по тегло. В противен случай ще се използва ключът за маршрутизиране или хедъри.

Трябва да помага, когато пропускната способност на потребителя изисква нарастване, което е по-високо от решението с няколко потребители, използващи една опашка.

Комбиниране на обменници (E2E)

Поведението на всички обменници може да бъде комбинирано чрез свързване Exchange-to-Exchange (комбинирането на обменници не е включено в спецификацията AMQP. Това е разширение на протокола от страна на RabbitMQ).

Графично представяне на потока от съобщения:

RabbitMQ. Част 2. Разглеждаме Exchanges

Благодарение на E2E можем да намерим правилната мащабируема конфигурация, която отговаря на текущите и нарастващите изисквания.

Създаване на Exchange

Създаването на обменник става с помощта на синхронно RPC запитване към сървъра. Запитването се извършва чрез метода Exchange.Declare, извикван с параметри:

  • име на обменника
  • тип на обменника
  • други параметри

Пример за създаване exchange с помощта на RabbitMQ.Client:

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

  • exchange — име на обменника, който искаме да създадем. Името трябва да е уникално
  • тип — тип на обменника
  • durable — ако зададете true, тогава exchange ще бъде постоянен. Той ще се съхранява на диска и ще може да оцелее при рестартиране на сървъра/брокера. Ако стойността false, тогава exchange е временна и ще бъде изтрита, когато сървърът/брокерът бъде рестартиран
  • autoDelete — автоматично изтриване. Обмен ще бъде изтрит, когато всички свързани с него опашки бъдат изтрити
  • arguments — незадължителни аргументи. Най-често, чрез аргументите се задават alternative exchange (алтернативен обменник). Ако съобщението не може да премине по първоначалния маршрут, може да бъде изпратено в алтернативен обменник за маршрутизиране по друг път.

RabbitMQ. Част 2. Разглеждаме Exchanges

Ако създаването exchange е възможно, то сървърът ще изпрати синхронен на клиента RPC отговор Exchange.DeclareOk. Ако създаването не е възможно (възникнало е отказване на заявката Exchange.Declare), то каналът ще бъде затворен от сървъра с помощта на асинхронна команда Channel.Close и клиентът ще получи изключение OperationInterruptedException, което ще съдържа код на грешка и нейното описание.

Обменникът трябва да бъде създаден преди публикуването на съобщения. Ако публикувате съобщение в не съществуващ обменник — RabbitMQ тихо ще го изтрие.

Създаване на Exchange чрез графичния интерфейс

Влизаме в административната панела RabbitMQ с потребителя guest (потребителско име: guest и парола: guest). Обърнете внимание, че потребителят guest може да се свързва само от локалния хост. Сега преминаваме към таба Exchanges и натискаме на Добавяне на нов обменник. Попълваме свойствата:

RabbitMQ. Част 2. Разглеждаме Exchanges

Повечето от свойствата са описани по-горе. Тук ще отбележим, че ако зададете Internal, обменът ще може да се използва само за E2E. Producer няма да може да изпраща съобщения на такъв обмен.

Заключение

При разработването на система е удобно да се опише топологията на маршрутизацията с помощта на граф. Но преди да започнете да изграждате графа е важно да се идентифицират пътищата с голям трафик, тъй като именно те изискват по-висока пропускна способност (производителност). След това можете да класифицирате трафика. И едва тогава да се пристъпи към изграждане.

Ако в построения граф съществува крайно множество ключове за маршрутизиране, то трябва да помислите за няколко fanout exchange, които са 1:1 свързани с ключа за маршрутизиране. Помнете, че fanout exchange най-бързият.

Ако броят на маршрутите стреми към безкрайност, то е необходимо да се обърне внимание на топик обмен или, ако шаблон не е необходим, може да се избере direct exchange, тъй като той е по-бърз топик обмен.

Комбинации от различни exchange трябва да помогнат да се намери правилната масштабируем конфигурация, която отговаря както на текущите, така и на растящите изисквания на системата.

Брой exchange и опашките трябва да бъдат минимални в сравнение с броя на маршрутите.

В следващата статия ще започнем да се занимаваме по-подробно с опашките и връзките.

Връзки

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster