RabbitMQ. Дел 2. Разбирање на размена

Exchange - разменувач или место за размена. До него се испраќаат пораки. Exchange ја дистрибуира пораката во една или повеќе редици. Тој ги насочува пораките во редица врз основа на креирани врски (bindings) помеѓу него и редот.

Exchange не е Ерланг процес. Од причини за приспособливост exchange е низа (врска до модулот со кодот каде што е логиката за рутирање) во вградената база на податоци мнезија. 1 илјада разменувачи ќе трошат само 1MB меморија.

Содржина

  • RabbitMQ. Дел 1. Вовед. Erlang, AMQP и RPC
  • RabbitMQ. Дел 2. Разбирање на размена
  • RabbitMQ. Дел 3. Разбирање на редици и врски
  • RabbitMQ. Дел 4. Справување со она што се пораки и рамки
  • RabbitMQ. Дел 5: Изведба на објавување и потрошувачка на пораки
  • RabbitMQ. Дел 6. Преглед на модулите на федерацијата и лопата
  • 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 е 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 (хаш-конзистентна размена) - се користи кога има повеќе редици кои се потенцијални примачи на порака и кога треба да вчитате рамнотежа помеѓу нив. Пораката е поврзана со редот по тежина (условена вредност на низата од 0 - n).

Еквивалентна тежина на редиците - покажува дека секоја редица ќе добие приближно иста количина пораки (секоја порака ќе биде ставена само во една редица). Не постои целосна гаранција за униформа дистрибуција на пораките.

Графички приказ на протокот на пораките:

RabbitMQ. Дел 2. Разбирање на размена

Hash пресметано врз основа на клуч за рутирање или својство headers пораки. Ако сите објавени пораки имале различни клучеви за рутирање, или headers, тогаш распределбата ќе се случи по тежина. Во спротивно, ќе се користи клучот за насочување или headers.

Треба да помогне кога пропусната моќ на потрошувачите треба да порасне повисоко од решение со повеќе потрошувачи кои користат иста редица.

Комбинација на разменувачи (E2E)

Однесувањето на сите разменувачи може да се комбинира со користење на комуникација Размена за размена (комбинацијата на разменувачи не е вклучена во спецификацијата AMQP. Ова е продолжување на протоколот од страна RabbitMQ).

Графички приказ на протокот на пораките:

RabbitMQ. Дел 2. Разбирање на размена

На сметка на E2E можеме да ја најдеме вистинската скалабилна конфигурација која ги задоволува и сегашните и растечките барања.

Креирај размена

Разменувачот се создава со помош на синхрони RPC барање до серверот. Барањето е направено со користење на методот Exchange.Declare, повикан со параметри:

  • име на разменувач
  • тип на разменувач
  • други опции

Пример за создавање exchange со помош на RabbitMQ.Клиент:

//...
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 тивко отстранете го.

Направете графички интерфејс за размена

Одете во административниот панел RabbitMQ под корисник guest (корисничко име: guest и лозинка: guest). Ве молиме имајте предвид дека корисникот guest може да се поврзе само од локалниот хост. Сега да одиме на јазичето 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

Додадете коментар