Exchange — փոխանակիչ կամ առևտրի կետ: Մեծահասակները հաղորդագրություններ են ուղարկվում դրան: Exchange բաշխում է հաղորդագրությունը մեկ կամ մի քանի հերթերի մեջ: Այն ուղղորդում է հաղորդագրությունները հերթին ստեղծված կապերի հիման վրա (bindings) դրա և հերթի միջև:
Exchange չի հանդիսանում . Մասշտաբայնության հարցերով exchange — դա ստեղնագիր (մոդուլի հղում, որտեղ գտնվում է ուղեգծման տրամաբանությունը) ներառված տվյալների բազայում . 1 հազար փոխանակիչներ կօգտագործեն ընդամենը 1ՄԲ հիշողություն:
Բովանդակություն
- 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 կան հասկացություն ներդրված փոխանակիչ. Սա direct exchange անվան չունեցող: Եթե կիրառվում է ներդրված փոխանակիչ, ապա հաղորդագրությունը կառավարվում է այն հերթին, որի անունը համապատասխանում է հաղորդագրության ուղղորդման բանալու.
Topic Exchange
Topic exchange – նման է direct exchange տալիս ընտրության ուղղորդման հնարավորություն, համեմատելով ուղղորդման բանալուն: Սակայն, այստեղ բանալին սահմանվում է շաբլոնով. Շաբլոնի ստեղծման ժամանակ օգտագործվում են 0 մեկ կամ ավելի բառեր (հրահռայ 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
Fanout exchange – առողջ հաղորդագրություններ են հասցվում բոլոր հերթերին նույնիսկ եթե հաղորդագրության մեջ սահմանված է ուղղորդման բանալու:
Особенности:
RabbitMQչի աշխատում ուղղորդման բանալուների և շաբլոնների հետ ինչը դրական ազդեցություն է ունենում աշխատանքի վրա։ Սա ամենաարագexchange;- բոլոր սպառողները պետք է կարողանան մշակել բոլոր հաղորդագրությունները;
Հաղորդագրությունների հոսքի գրաֆիկական ներկայացում:

Headers Exchange
Headers exchange — ուղարկում է հաղորդագրությունները կապված հերթեր, հիմնված զույգերի ( բանալին, արժեք ) հատկության համեմատության վրա headers կապակցված և հաղորդագրության համապատասխան հատկության։ headers ներկայացնում է Dictionary<բանալին, արժեք>.
Եթե բառարանին ավելացնել հատուկ բանալին x-match արժեքով ինչպես որ, ապա հաղորդագրությունը կուղարկվի մասնակի համահունչության դեպքում ( բանալին, արժեք )։ Այս վարքագիծը համեմատելի է օպերատորի or.
var bindingArguments = new Dictinary<String, Object>();
bindingArguments.add("x-match", "any");Կռահում է, որ բանալին x-match ունենա արժեք բոլորը։ Սա նշանակում է, որ հաղորդագրությունը կուղարկվի ամբողջական համահունչության դեպքում ( բանալին, արժեք )։ Այս վարքագիծը համեմատելի է օպերատորի and.
Հաղորդագրությունների հոսքի գրաֆիկական ներկայացում:

Особенности:
- ավելորդ ճկունություն
- ավելորդ հաշվարկային ծախսեր։ Բոլոր զույգերը ( բանալին, արժեք ) հատկության
headersկան անպայմանորեն դասավորված բանալիի անունով հաշվարկելուց առաջ հաղորդագրության ուղարկման արժեքները։ Ավելի դանդաղ, քան այլ տեսակներ փոխանակում.
Consistent- Hashing Exchange
Այս փոխանակումը հանդիսանում է և ոչ կառուցվածք մեջ RabbitMQ.
Consistent-hashing exchange (կանոնավոր Hashing հարցում) – օգտագործվում է, երբ կան մի քանի հերթեր, որոնք հանդիսանում են հաղորդագրության հնարավոր ստացողներ, և երբ անհրաժեշտ է բաշխել ծանրաբեռնվածությունը նրանց միջև։ Հաղորդագրության կապը հերթի հետ կատարվում է քաշով ( պայմանական տողային արժեքանոցից 0 - n).
Համարժեք քաշի հերթերը – վերնագրում է, որ յուրաքանչյուր հերթ կմասվեն մոտավորապես միևնույն քանակությամբ հաղորդագրություններ ( յուրաքանչյուր հաղորդագրությունը կտեղափոխվի միայն մեկ հերթում )։ Ամբողջ garantija հավասար բաշխման հաղորդագրությունների առկա չէ.
Հաղորդագրությունների հոսքի գրաֆիկական ներկայացում:

Hash հաշվարկվում էRouting key-ի կամ հատկության հիման վրա headers հաղորդագրության։ Եթե բոլոր հրապարակվող հաղորդագրություններն ունեն տարբեր Routing key-ներ կամ headers, ապա բաշխումը տեղի կունենա քաշով։ Եթե չէ, ապա կօգտագործվի Routing key կամ headers.
Պետք է օգնի, երբ սպառողի անցակալի ունակությունը աճում է: դժվար մատուցել ասված լուծումից ավելի բարձր, քան մի քանի սպառողներ, որոնք օգտագործում են մեկ հերթ։
Փոխանակողների համադրումը ( E2E )
Անվտանգություն բոլոր փոխանակողների վարքագիծը կարող է համադրվել առ այսօր: Exchange-to-Exchange (փոխանակիչների համադրումը չի մտնում մասնագիտացված իշխան AMQP։ Սա պրոտոկոլի ընդլայնում է RabbitMQ).
Հաղորդագրությունների հոսքի գրաֆիկական ներկայացում:

Կայքի շնորհիվ E2E ենք կարող եք գտնել ճիշտ մեծածախ կոնֆիգուրացիա, որը կբավարարի ինչպես առկա, այնպես էլ աճող պահանջների։
Դպրոցների ստեղծումը
Դպրոցների ստեղծումը տեղի է ունենում շնորհիվ սինխրոնային RPC հարցման միջոցով սերվերին։ Հարցումը տեղի է ունենում Exchange.Declare, որը ելնում է պարամետրերով՝
- փոխանակման անուն
- փոխանակման տեսակը
- այլ պարամետրեր
Օրինակ ստեղծման exchange օգտագործելով :
//...
channel.ExchangeDeclare(
exchange: "my_exchange",
type: "direct",
durable: "false",
autoDelete: "false",
arguments: null
);
//...exchange— այն փոխանակման անուն, որը մենք ցանկանում ենք ստեղծել։ Անվանումը պետք է լինի եզակիtype— փոխանակման տեսակտևական— եթե տեղադրվիճշմարիտ, ապաexchangeկանոնավոր կլինի։ Այն պահպանվելու է սկավառակում և կկարողանա ապրեցնել սերվերի/բրոկերի վերագործարկումը։ Եթե արժեքըսուտ, ապաexchangeկ կլինի ժամանակավոր և կջնջվի, երբ սերվերը/բրոկերը վերագործարկվիautoDelete— ավտոմատ ջնջում։Exchangeկ ջնջվի, երբ բոլոր դրա հետ կապված հերթերը ջնջվենarguments— ընտրովի վարկածներ։ Հաճախ, վարկածների միջոցով սահմանում ենalternative exchange(ընտրական փոխանակում). Եթե հաղորդագրությունը չի կարող անցնել սկզբնական երթուղով, այն կարելի է ուղարկել ընտրական փոխանակում այլ ճանապարհով երթուղավորում կատարելու համար։

Եթե ստեղծումը exchange հնարավոր է, ապա սերվերը կուղարկի հաճախորդին համաժամեցված RPC պատասխանը Exchange.DeclareOk։ Եթե ստեղծումը հնարավոր չէ (կանխավորը մերժված է Exchange.Declare), ապա ալիքը կփակի սերվերի կողմից ասինխրոն հրամանի միջոցով Channel.Close և հաճախորդը կստանա բացառություն , որը կպահի սխալի կոդն ու դրա նկարագրությունը։
Փոխանակումը պետք է ստեղծվի հաղորդագրություններ հրապարակելուց առաջ։ Եթե դուք հրապարակեք հաղորդագրություն գոյություն չունեցող փոխանակման մեջ — RabbitMQ այն հանգիստ կջնջվի։
Exchange ստեղծելը՝ գրաֆիկական ինտերֆեյսի միջոցով
Մուտք եք գործում ադմինիստրատորային ներքին էջում RabbitMQ օգտվելուց guest (կոդ: guest և գաղտնաբառ: guest). Նշեք, որ օգտվողը guest կարող է միանալ միայն տեղական հոստից։ Այժմ անցնենք Exchanges և սեղմենք Add a new exchange։ Դրանում լրացնում ենք բնութագրերը։

Բազմաթիվ բնութագրեր վերոնշված են։ Այստեղ նշենք, որ եթե սահմանենք Internal, ապա փոխանակումը կարելի կլինի օգտագործել միայն E2E. Producer չի կարողանա հաղորդագրություններ ուղարկել այսպիսի փոխանակման։
Ավարտ
Մասնակցելով համակարգի զարգացումն արդյունավետ է նկարագրել ճանապարհների տոպոլոգիան ցանցի միջոցով։ Բայց նախքան ցանցի կառուցելը, արժե առանձնացնել մեծ տրաֆիկ ունեցող ուղիները, քանի որ հենց դրանք պահանջում են բարձր throughput (արդյունավետություն)։ Հետո կարելի է դասակարգել ընդհանուր հոսքը։ Եվ արդեն հետո սկսել կառուցումը։
Եթե կառուցված ցանցում կա վերջնական բազմություն ուղենիշների, ապա արժե նայել մի քանի fanout exchange, որոնք 1:1 կապված են ուղենիշի հետ։ Հիշենք, որ fanout exchange ամենաարագն է։
Եթե երթուղիների թիվը հասնում է անվերջի, ապա արժե ուշադրություն դարձնել topic exchange կամ, եթե նմուշը պետք չէ, ապա կարելի է ընտրել direct exchange, քանի որ այն ավելի արագ է topic exchange.
Տարբեր կոմբինացիաների exchange պետք է օգնի գտնել ճիշտ ացածողական կոնֆիգուրացիա, որը բավարարում է ինչպես ներկայիս, այնպես էլ աճի պահանջներին համակարգի։
Քանակը exchange և հերթերի թիվը պետք է նվազագույն լինի՝ ի համեմատ երթուղիների թվի։
Հաջորդ հոդվածում սկսելու ենք մանրամասնել Queues և Bindings։
Հղումներ
Ընտանիք: habr.com
