RabbitMQ. Част 2. Разбиране на борсите

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

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

Таблица на съдържанието

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

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

Direct exchange - използва се при нужда доставят съобщение до определени опашки. Съобщението се публикува в обменника със специфичен ключ за маршрутизиране и попада във всички опашки, които са свързани с този обменник с подобен ключ за маршрутизиране. Ключът за маршрутизиране е низ. Съпоставянето се извършва с помощта на проверка на низове за равенство.

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

RabbitMQ. Част 2. Разбиране на борсите

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

Обмен на теми

Topic exchange - подобен direct exchange позволява селективно маршрутизиране чрез сравняване на ключа за маршрутизиране. Но в този случай ключът е даден по шаблон. Когато създавате шаблон, използвайте 0 или повече думи (букви AZ и az и числа 0-9), разделени с точка, както и символи * и #.

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

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

RabbitMQ. Част 2. Разбиране на борсите

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

RabbitMQ. Част 2. Разбиране на борсите

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

Удобства:

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

Размяна на Fanout

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

Удобства:

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

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

RabbitMQ. Част 2. Разбиране на борсите

Размяна на заглавки

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

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

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

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

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

RabbitMQ. Част 2. Разбиране на борсите

Удобства:

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

Последователен обмен на хеширане

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

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

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

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

RabbitMQ. Част 2. Разбиране на борсите

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

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

Комбинация от топлообменници (E2E)

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

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

RabbitMQ. Част 2. Разбиране на борсите

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

Създайте борса

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

  • име на обменника
  • тип обменник
  • други възможности

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

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

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

RabbitMQ. Част 2. Разбиране на борсите

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

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

Създайте GUI на Exchange

Отидете в админ панела RabbitMQ под потребител guest (потребителско име: guest и парола: guest). Моля, имайте предвид, че потребителят guest може да се свързва само от localhost. Сега да отидем на раздела Exchanges и щракнете върху Add a new exchange. Попълнете свойствата:

RabbitMQ. Част 2. Разбиране на борсите

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

Заключение

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

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

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

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

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

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

Позоваването

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

Добавяне на нов коментар