Exchange - измјењивач или замјенско мјесто. На њега се шаљу поруке. Exchangeдистрибуира поруку у једном или више редова. Он усмерава поруке у ред на основу креираних веза (bindings) између њега и реда.
Exchange није Ерлангов процес. Из разлога скалабилности exchange је стринг (линк до модула са кодом где се налази логика рутирања) у уграђеној бази података мнезија. 1 размењивача ће потрошити само 1МБ меморије.
РаббитМК. Део 4. Бављење оним што су поруке и оквири
РаббитМК. Део 5: Перформансе објављивања и конзумирања порука
РаббитМК. Део 6. Преглед модула Федерације и Лопате
РаббитМК. Део 7. Детаљи о Цоннецтион и Цханел
РаббитМК. Део 8. РаббитМК у .НЕТ-у
РаббитМК. Део 9. Мониторинг
Директна размена
Direct exchange - користи се по потреби доставити поруку одређеним редовима. Порука се објављује размењивачу са одређеним кључ за рутирање и улази у све редове који су повезани са овим размењивачем са сличним кључем за рутирање. Кључ за рутирање је низ. Упаривање се врши помоћу провера једнакости низова.
Графички приказ тока поруке:
В rabbitmq постоји концепт подразумевани размењивач. Она direct exchange без имена. Ако се користи подразумевани размењивач, онда ће порука бити преусмерена у ред са именом једнаким кључ за рутирање порука.
Размена тема
Topic exchange – слично direct exchange омогућава селективно рутирање упоређивањем кључа за рутирање. Али, у овом случају, кључ је дат према шаблону. Када креирате шаблон, користите 0 или више речи (слова AZ и az и бројевима 0-9), одвојене тачком, као и симболи * и #.
* - може се заменити са тачно 1 реч
# - може се заменити са 0 или више речи
Графички приказ тока поруке:
Почевши од верзије RabbitMQ 2.4.0 алгоритам рутирања за topic exchange почео да ради до 145 пута брже. То су постигли применом приступа покушајте имплементацију, што подразумева представљање шаблона као структуре стабла. На пример шаблони a.b.c, a.*.b.c, a.#.c и b.b.c биће представљена следећом структуром:
Поклапање узорака се тражи почевши од корена и од врха до дна.
Карактеристике:
употреба овог измењивача може постати добар избор за могући будући развој апликација, јер шаблони се увек могу прилагодити тако да се порука објави на сличан начин direct exchange или fanout exchange
шаблони који користе *много брженего шаблони који користе #.
topic exchange спорији direct exchange
Фаноут Екцханге
Fanout exchange - све поруке се испоручују у све редове чак и ако је кључ за рутирање наведен у поруци.
Карактеристике:
RabbitMQне ради са кључевима и шаблонима за рутирање што позитивно утиче на перформансе. Ово је најбрже 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.
Графички приказ тока поруке:
Карактеристике:
додатна флексибилност
додатни рачунски трошкови. Сви парови (кључ, вредност) атрибута headers мора се сортирати по имену кључа пре израчунавања вредности рутирања порука. Спорије од других врста размене.
Конзистентна размена хеширања
Овај измењивач је повезати и није уграђено в RabbitMQ.
Consistent-hashing exchange (размена са доследним хеширањем) – користи се када постоји више редова који су потенцијални примаоци поруке и када треба да избалансирате оптерећење између њих. Порука је повезана са редом по тежини (условна вредност стринга из 0 - n).
Еквивалентна тежина редова - означава да ће сваки ред примити отприлике исти износ поруке (свака порука ће бити стављена у само један ред чекања). Не постоји потпуна гаранција уједначене дистрибуције порука.
Графички приказ тока поруке:
Hash израчунати на основу кључа или својства рутирања headers поруке. Ако су све објављене поруке имале различите кључеве за рутирање, или headers, онда ће се расподела десити по тежини. У супротном ће се користити кључ за рутирање, или headers.
Требало би да помогне када пропусност потрошача треба да расте више од решења са више потрошача који користе исти ред.
Комбинација измењивача (Е2Е)
Понашање свих измењивача може се комбиновати коришћењем комуникације Екцханге-то-Екцханге (комбинација измењивача није укључена у спецификацију AMQP. Ово је проширење протокола са стране RabbitMQ).
Графички приказ тока поруке:
На рачун E2E можемо пронаћи праву скалабилну конфигурацију која испуњава и тренутне и растуће захтеве.
Креирајте размену
Измјењивач се креира помоћу синхроне RPC захтев серверу. Захтев се поставља методом Exchange.Declare, позван са параметрима:
exchange - назив размењивача који желимо да креирамо. Име мора бити јединствено
type - врста измењивача
durable - ако је инсталиран true, Онда exchange биће трајна. Биће сачуван на диску и моћи ће да преживи поновно покретање сервера/брокера. Ако вредност false, Онда exchange је привремена и биће уклоњена када се сервер/брокер поново покрене
autoDelete - аутоматско брисање. Exchange биће обрисан када се избришу сви повезани редови
arguments су необавезни аргументи. Најчешће кроз постављене аргументе alternative exchange (алтернативни измењивач). Ако порука не може да прође кроз оригиналну руту, може се послати на алтернативну размену да би била преусмерена другом путањом.
Ако стварање exchangeможда, онда ће сервер послати клијенту синхрони RPC одговор Exchange.DeclareOk. Ако стварање немогуће (било је одбијено на захтев Exchange.Declare), онда канал ће се затворити сервер помоћу асинхроне команде Channel.Close а клијент ће добити изузетак ОператионИнтерруптедЕкцептион, који ће садржати шифру грешке и њен опис.
Размјењивач мора бити креиран прије објављивања. Ако објавите поруку неком непостојећем размењивачу - RabbitMQ тихо га уклоните.
Направите Екцханге ГУИ
Идите на административни панел RabbitMQ под корисником guest (корисничко име: guest и лозинка: guest). Имајте на уму да корисник guest може да се повеже само са локалног хоста. Сада идемо на картицу Exchanges и кликните на Add a new exchange. Попуните својства:
Већина својстава је описана горе. Овде примећујемо да ако поставимо Internal, онда се размена може користити само за E2E. Producer неће моћи да шаље поруке таквој размени.
Закључак
Приликом развоја система згодно је описати топологију рутирање користећи граф. Али пре него што почнете да градите графикон, вреди истакнути стазе са великим прометом, јер. захтевају већа пропусност (перформансе). Затим можете класификовати саобраћај. А онда почните да градите.
Ако у конструисаном графу постоји коначан скуп кључеве за рутирање, дакле, вреди погледати неколико fanout exchange, који су 1:1 повезани са кључем за рутирање. Запамтите да fanout exchange најбрже.
Ако број рута тежи бесконачности, вреди обратити пажњу topic exchange или, ако шаблон није потребан, онда можете изабрати direct exchnge, јер он је бржи topic exchange.
Комбинације разних exchange требало би да вам помогне да пронађете праву. скалабилна конфигурација, који испуњава тренутне и растуће системске захтеве.
број exchange а редови треба да буду минимални у поређењу са бројем рута.
У следећем чланку ћемо почети да разумемо више о редовима и везама.