RabbitMQ. Частка 2. Разбіраемся з Exchanges

Exchange - абменнік або кропка абмену. У яго адпраўляюцца паведамленні. Exchange размяркоўвае паведамленне у адну ці некалькі чэргаў. Ён маршрутызуе паведамленні ў чаргу на аснове створаных сувязей (bindings) паміж ім і чаргой.

Exchange не з'яўляецца Erlang-працэсам. З меркаванняў маштабаванасці exchange - гэта радок (спасылка на модуль з кодам, дзе ляжыць логіка маршрутызацыі) ва ўбудаванай базе дадзеных mnesia. 1 тысячы абменнікаў будуць спажываць усяго 1МБ памяці.

Змест

  • RabbitMQ. Частка 1. Introduction. 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. Маніторынг

Direct Exchange

Direct exchange - выкарыстоўваецца, калі трэба даставіць паведамленне ў пэўныя чэргі. Паведамленне публікуецца ў абменнік з пэўным ключом маршрутызацыі і трапляе ва ўсе чэргі, якія звязаны з гэтым абменнікам аналагічным ключом маршрутызацыі. Ключ маршрутызацыі - гэта радок. Пошук адпаведнасці адбываецца пры дапамозе праверкі радкоў на эквівалентнасць.

Графічнае прадстаўленне патоку паведамленняў:

RabbitMQ. Частка 2. Разбіраемся з Exchanges

В rabbitmq існуе паняцце абменнік па змаўчанні. Гэта direct exchange без імя. Калі ўжываецца абменнік па змаўчанні, тое паведамленне будзе маршрутызавацца ў чаргу з імем роўным ключы маршрутызацыі паведамлення.

Topic Exchange

Topic exchange - аналагічна direct exchange дае магчымасць ажыццяўлення выбарачнай маршрутызацыі шляхам параўнання ключа маршрутызацыі. Але, у дадзеным выпадку, ключ задаецца па шаблоне. Пры стварэнні шаблона выкарыстоўваюцца 0 ці больш слоў (літары AZ и az і лічбы 0-9), падзеленых кропкай, а таксама сімвалы * и #.

  • * - можа быць заменены на роўна 1 слова
  • # - можа быць заменены на 0 ці больш слоў

Графічнае прадстаўленне патоку паведамленняў:

RabbitMQ. Частка 2. Разбіраемся з Exchanges

Пачынаючы з версіі RabbitMQ 2.4.0 алгарытм маршрутызацыі для topic exchange стаў працаваць да 145 раз хутчэй. Дабіліся яны гэтага шляхам укаранення падыходу trie implementation, які мае на ўвазе ўяўленне шаблонаў у выглядзе структуры дрэва. Напрыклад шаблоны a.b.c, a.*.b.c, a.#.c и b.b.c будуць прадстаўлены наступнай структурай:

RabbitMQ. Частка 2. Разбіраемся з Exchanges

Пошук адпаведнасці шаблону ажыццяўляецца, пачынаючы з кораня і вынікаючы зверху ўніз.

Асаблівасці:

  • ужыванне гэтага абменніка можа стаць добрым выбарам для магчымага будучага развіцця прыкладання, т.я. шаблоны заўсёды можна наладзіць так, каб паведамленне публікавалася аналагічна direct exchange або fanout exchange
  • шаблоны, якія выкарыстоўваюць * нашмат хутчэй, чым шаблоны, якія выкарыстоўваюць #.
  • topic exchange павольней direct exchange

Fanout Exchange

Fanout exchange - усе паведамленні дастаўляюцца ва ўсе чэргі нават калі ў паведамленні зададзены ключ маршрутызацыі.

Асаблівасці:

  • RabbitMQ не працуе з ключамі маршрутызацыі і шаблонамі што станоўча ўплывае на прадукцыйнасць. Гэта самы хуткі exchange;
  • усе спажыўцы павінны мець магчымасць апрацоўваць усе паведамленні;

Графічнае прадстаўленне патоку паведамленняў:

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, выкліканага з параметрамі:

  • назва абменніка
  • тып абменніка
  • іншыя параметры

Прыклад стварэння 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. Разбіраемся з Exchanges

Калі стварэнне exchange магчыма, то сервер адправіць кліенту сінхронны RPC адказ Exchange.DeclareOk. Калі стварэнне немагчыма (адбылася адмова па запыце Exchange.Declare), то канал закрыецца серверам пры дапамозе асінхроннай каманды Channel.Close і кліент атрымае выключэнне OperationInterruptedException, якое будзе змяшчаць код памылкі і яе апісанне.

Абменнік павінен быць створаны перад публікацыяй паведамленняў. Калі вы апублікуеце паведамленне ў нейкі не існуючы абменнік RabbitMQ ціха выдаліць яго.

Стварэнне Exchange праз графічны інтэрфейс

Заходзім у панэль адміністратара RabbitMQ пад карыстальнікам guest (username: guest і password: guest). Звярніце ўвагу, што карыстальнік guest можа падлучацца толькі з лакальнага хаста. Цяпер пяройдзем на ўкладку Exchanges і націснем на Add a new exchange. Запаўняем ўласцівасці:

RabbitMQ. Частка 2. Разбіраемся з Exchanges

Большасць уласцівасцяў была апісана вышэй. Тут адзначым, што калі задаць Internal, то абмен можна будзе выкарыстоўваць толькі для E2E. Producer не зможа адпраўляць паведамленні на такі абмен.

Заключэнне

Пры распрацоўцы сістэмы зручна апісваць тапалогію маршрутызацыі пры дапамозе графа. Але перш чым пачаць будаваць граф варта вылучыць шляхі з вялікім трафікам, т.я. менавіта яны патрабуюць больш высокую прапускную здольнасць (прадукцыйнасць). Далей можна класіфікаваць трафік. І ўжо потым прыступіць да пабудовы.

Калі ў пабудаваным графе існуе канчатковае мноства ключоў маршрутызацыі, тое, варта паглядзець у бок некалькіх fanout exchange, якія 1:1 звязаны з ключом маршрутызацыі. Памятаем, што fanout exchange самы хуткі.

Калі колькасць маршрутаў імкнецца да бясконцасці, то варта звярнуць увагу на topic exchange або, калі шаблон не патрэбен, то можна абраць direct exchnge, т.я. ён хутчэй topic exchange.

Камбінацыі розных exchange павінна дапамагчы знайсці правільную якая маштабуецца канфігурацыю, Якая адказвае як бягучым, так і якія растуць патрабаванням сістэмы.

Колькасць exchange і чэргаў павінна быць мінімальна ў параўнанні з колькасцю маршрутаў.

У наступным артыкуле пачнем разбірацца падрабязней з Queues і Bindings.

Спасылкі

Крыніца: habr.com

Дадаць каментар