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

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

Обмен не является Erlang-процессом. Из соображений масштабируемости обменник — это строка (ссылка на модуль с кодом, где лежит логика маршрутизации) во встроенной базе данных mnesia. 1 тысяча обменников будут потреблять всего 1МБ памяти.

Съдържание

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

Прямой обменник

Прямой обменник — используется, когда нужно доставить сообщение в определенные очереди.Сообщение публикуется в обменник с определенным ключом маршрутизации и попадает во все очереди, которые связаны с этим обменником аналогичным ключом маршрутизации. Ключ маршрутизации — это строка.Поиск соответствия происходит при помощи проверки строк на эквивалентность..

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

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

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

Тематика обменника

Тематика обменник – аналогично прямой обменник дает возможность осуществления выборочной маршрутизации путем сравнения ключа маршрутизации. Но, в данном случае, ключ задается по шаблону.При создании шаблона используются 0 или более слов (буквы AZ и 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 exchange – всички съобщения се доставят до всички опашки дори ако в съобщението е зададен ключ за маршрутизация.

Особености:

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

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

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

Headers Exchange

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

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

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

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

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

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

Особености:

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

Consistent-Hashing Exchange

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Влизаме в администрацията RabbitMQ като потребител гость (username: гость и password: гость). Обърнете внимание, че потребителят гость може да се свързва само от локалния хост. Сега преминаваме на таба Exchanges и кликваме на Add a new exchange. Попълваме свойствата:

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

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

Заключение

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

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

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

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

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

В следващата статия ще започнем да разглеждаме по-подробно Queues и Bindings.

Връзки

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

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