RabbitMQ. Մաս 2. Փոխանակումների ըմբռնում

Exchange - փոխանակիչ կամ փոխանակման կետ: Հաղորդագրություններ են ուղարկվում դրան: Exchange տարածում է հաղորդագրությունը մեկ կամ մի քանի հերթերում. Նա ուղարկում է հաղորդագրությունները դեպի հերթ ստեղծված հղումների հիման վրա (bindings) դրա և հերթի միջև:

Exchange չէ Erlang գործընթացը. Մասշտաբայնության պատճառներով exchange ներկառուցված տվյալների բազայում տող է (մոդուլի հղում կոդով, որտեղ գտնվում է երթուղային տրամաբանությունը) մնեզիա. 1 հազար փոխանակիչները կսպառեն ընդամենը 1 ՄԲ հիշողություն։

Պահեստավորված նյութեր

  • 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.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 լուռ հեռացրեք այն:

Ստեղծեք Exchange GUI

Գնացեք ադմինիստրատորի վահանակ 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 իսկ հերթերը պետք է լինեն նվազագույն՝ համեմատած երթուղիների քանակի հետ:

Հաջորդ հոդվածում մենք կսկսենք ավելին հասկանալ Հերթերի և Կապերի մասին:

Սայլակ

Source: www.habr.com

Добавить комментарий