RabbitMQ. Մաս 2. Մարզում ենք Exchange-ները

Exchange — փոխանակիչ կամ առևտրի կետ: Մեծահասակները հաղորդագրություններ են ուղարկվում դրան: Exchange բաշխում է հաղորդագրությունը մեկ կամ մի քանի հերթերի մեջ: Այն ուղղորդում է հաղորդագրությունները հերթին ստեղծված կապերի հիման վրա (bindings) դրա և հերթի միջև:

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

Բովանդակություն

  • RabbitMQ. Մաս 1. Ներածություն. Erlang, AMQP և RPC
  • RabbitMQ. Մաս 2. Մարզում ենք Exchange-ները
  • 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. Մարզում ենք Exchange-ները

Մեույն rabbitmq կան հասկացություն ներդրված փոխանակիչ. Սա direct exchange անվան չունեցող: Եթե կիրառվում է ներդրված փոխանակիչ, ապա հաղորդագրությունը կառավարվում է այն հերթին, որի անունը համապատասխանում է հաղորդագրության ուղղորդման բանալու.

Topic Exchange

Topic exchange – նման է direct exchange տալիս ընտրության ուղղորդման հնարավորություն, համեմատելով ուղղորդման բանալուն: Սակայն, այստեղ բանալին սահմանվում է շաբլոնով. Շաբլոնի ստեղծման ժամանակ օգտագործվում են 0 մեկ կամ ավելի բառեր (հրահռայ AZ և ազերբայջաներեն և թվեր 0-9), բաժանված կետով, ինչպես նաև նիշեր * և #.

  • * — կարող է փոխարինվել գրեթե 1 բառով
  • # — կարող է փոխարինվել 0 մեկ կամ ավելի բառերով

Հաղորդագրությունների հոսքի գրաֆիկական ներկայացում:

RabbitMQ. Մաս 2. Մարզում ենք Exchange-ները

Սկսած տարբերակով RabbitMQ 2.4.0 ուղղորդման ալգորիթմը topic exchange դարձել է ավելի 145 արագ: Նրանք հասել են դա, ներդրելով մոտեցում trie implementation, որը ենթադրում է շաբլոնների ներկայացումը ծառային կառուցվածքի տեսքով: Օրինակ, շաբլոնները a.b.c, a.*.b.c, a.#.c և b.b.c կայանում են հետևյալ կառուցվածքի:

RabbitMQ. Մաս 2. Մարզում ենք Exchange-ները

Համապատասխանության որոնումը շաբլոնին կատարվում է, սկսելով արմատից և հետևելով վերից վար:

Особенности:

  • այս փոխանակիչի կիրառումը կարող է լինել լավ ընտրություն ապագայում ծրագրի զարգացման համար, քանի որ շաբլոնները միշտ կարելի է տեղակայել այնպես, որպեսզի հաղորդագրությունը հրապարակվի նման direct exchange կամ fanout exchange
  • շաբլոններ, որոնք օգտագործում են * այն ավելի արագ, քան շաբլոնները, որոնք օգտագործում են #.
  • topic exchange մедленнее direct exchange

Fanout Exchange

Fanout exchangeառողջ հաղորդագրություններ են հասցվում բոլոր հերթերին նույնիսկ եթե հաղորդագրության մեջ սահմանված է ուղղորդման բանալու:

Особенности:

  • RabbitMQ չի աշխատում ուղղորդման բանալուների և շաբլոնների հետ ինչը դրական ազդեցություն է ունենում աշխատանքի վրա։ Սա ամենաարագ exchange;
  • բոլոր սպառողները պետք է կարողանան մշակել բոլոր հաղորդագրությունները;

Հաղորդագրությունների հոսքի գրաֆիկական ներկայացում:

RabbitMQ. Մաս 2. Մարզում ենք 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.

Հաղորդագրությունների հոսքի գրաֆիկական ներկայացում:

RabbitMQ. Մաս 2. Մարզում ենք Exchange-ները

Особенности:

  • ավելորդ ճկունություն
  • ավելորդ հաշվարկային ծախսեր։ Բոլոր զույգերը ( բանալին, արժեք ) հատկության headers կան անպայմանորեն դասավորված բանալիի անունով հաշվարկելուց առաջ հաղորդագրության ուղարկման արժեքները։ Ավելի դանդաղ, քան այլ տեսակներ փոխանակում.

Consistent- Hashing Exchange

Այս փոխանակումը հանդիսանում է ուղեցույց և ոչ կառուցվածք մեջ RabbitMQ.

Consistent-hashing exchange (կանոնավոր Hashing հարցում) – օգտագործվում է, երբ կան մի քանի հերթեր, որոնք հանդիսանում են հաղորդագրության հնարավոր ստացողներ, և երբ անհրաժեշտ է բաշխել ծանրաբեռնվածությունը նրանց միջև։ Հաղորդագրության կապը հերթի հետ կատարվում է քաշով ( պայմանական տողային արժեքանոցից 0 - n).

Համարժեք քաշի հերթերը – վերնագրում է, որ յուրաքանչյուր հերթ կմասվեն մոտավորապես միևնույն քանակությամբ հաղորդագրություններ ( յուրաքանչյուր հաղորդագրությունը կտեղափոխվի միայն մեկ հերթում )։ Ամբողջ garantija հավասար բաշխման հաղորդագրությունների առկա չէ.

Հաղորդագրությունների հոսքի գրաֆիկական ներկայացում:

RabbitMQ. Մաս 2. Մարզում ենք Exchange-ները

Hash հաշվարկվում էRouting key-ի կամ հատկության հիման վրա headers հաղորդագրության։ Եթե բոլոր հրապարակվող հաղորդագրություններն ունեն տարբեր Routing key-ներ կամ headers, ապա բաշխումը տեղի կունենա քաշով։ Եթե չէ, ապա կօգտագործվի Routing key կամ headers.

Պետք է օգնի, երբ սպառողի անցակալի ունակությունը աճում է: դժվար մատուցել ասված լուծումից ավելի բարձր, քան մի քանի սպառողներ, որոնք օգտագործում են մեկ հերթ։

Փոխանակողների համադրումը ( E2E )

Անվտանգություն բոլոր փոխանակողների վարքագիծը կարող է համադրվել առ այսօր: Exchange-to-Exchange (փոխանակիչների համադրումը չի մտնում մասնագիտացված իշխան AMQP։ Սա պրոտոկոլի ընդլայնում է RabbitMQ).

Հաղորդագրությունների հոսքի գրաֆիկական ներկայացում:

RabbitMQ. Մաս 2. Մարզում ենք Exchange-ները

Կայքի շնորհիվ E2E ենք կարող եք գտնել ճիշտ մեծածախ կոնֆիգուրացիա, որը կբավարարի ինչպես առկա, այնպես էլ աճող պահանջների։

Դպրոցների ստեղծումը

Դպրոցների ստեղծումը տեղի է ունենում շնորհիվ սինխրոնային RPC հարցման միջոցով սերվերին։ Հարցումը տեղի է ունենում Exchange.Declare, որը ելնում է պարամետրերով՝

  • փոխանակման անուն
  • փոխանակման տեսակը
  • այլ պարամետրեր

Օրինակ ստեղծման exchange օգտագործելով RabbitMQ.Client:

//...
channel.ExchangeDeclare(
    exchange: "my_exchange",
    type: "direct",
    durable: "false",
    autoDelete: "false",
    arguments: null
);
//...

  • exchange — այն փոխանակման անուն, որը մենք ցանկանում ենք ստեղծել։ Անվանումը պետք է լինի եզակի
  • type — փոխանակման տեսակ
  • տևական — եթե տեղադրվի ճշմարիտ, ապա exchange կանոնավոր կլինի։ Այն պահպանվելու է սկավառակում և կկարողանա ապրեցնել սերվերի/բրոկերի վերագործարկումը։ Եթե արժեքը սուտ, ապա exchange կ կլինի ժամանակավոր և կջնջվի, երբ սերվերը/բրոկերը վերագործարկվի
  • autoDelete — ավտոմատ ջնջում։ Exchange կ ջնջվի, երբ բոլոր դրա հետ կապված հերթերը ջնջվեն
  • arguments — ընտրովի վարկածներ։ Հաճախ, վարկածների միջոցով սահմանում են alternative exchange (ընտրական փոխանակում). Եթե հաղորդագրությունը չի կարող անցնել սկզբնական երթուղով, այն կարելի է ուղարկել ընտրական փոխանակում այլ ճանապարհով երթուղավորում կատարելու համար։

RabbitMQ. Մաս 2. Մարզում ենք Exchange-ները

Եթե ստեղծումը exchange հնարավոր է, ապա սերվերը կուղարկի հաճախորդին համաժամեցված RPC պատասխանը Exchange.DeclareOk։ Եթե ստեղծումը հնարավոր չէ (կանխավորը մերժված է Exchange.Declare), ապա ալիքը կփակի սերվերի կողմից ասինխրոն հրամանի միջոցով Channel.Close և հաճախորդը կստանա բացառություն OperationInterruptedException, որը կպահի սխալի կոդն ու դրա նկարագրությունը։

Փոխանակումը պետք է ստեղծվի հաղորդագրություններ հրապարակելուց առաջ։ Եթե դուք հրապարակեք հաղորդագրություն գոյություն չունեցող փոխանակման մեջ — RabbitMQ այն հանգիստ կջնջվի։

Exchange ստեղծելը՝ գրաֆիկական ինտերֆեյսի միջոցով

Մուտք եք գործում ադմինիստրատորային ներքին էջում RabbitMQ օգտվելուց guest (կոդ: guest և գաղտնաբառ: guest). Նշեք, որ օգտվողը guest կարող է միանալ միայն տեղական հոստից։ Այժմ անցնենք Exchanges և սեղմենք Add a new exchange։ Դրանում լրացնում ենք բնութագրերը։

RabbitMQ. Մաս 2. Մարզում ենք Exchange-ները

Բազմաթիվ բնութագրեր վերոնշված են։ Այստեղ նշենք, որ եթե սահմանենք Internal, ապա փոխանակումը կարելի կլինի օգտագործել միայն E2E. Producer չի կարողանա հաղորդագրություններ ուղարկել այսպիսի փոխանակման։

Ավարտ

Մասնակցելով համակարգի զարգացումն արդյունավետ է նկարագրել ճանապարհների տոպոլոգիան երթուղման ցանցի միջոցով։ Բայց նախքան ցանցի կառուցելը, արժե առանձնացնել մեծ տրաֆիկ ունեցող ուղիները, քանի որ հենց դրանք պահանջում են բարձր throughput (արդյունավետություն)։ Հետո կարելի է դասակարգել ընդհանուր հոսքը։ Եվ արդեն հետո սկսել կառուցումը։

Եթե կառուցված ցանցում կա վերջնական բազմություն ուղենիշների, ապա արժե նայել մի քանի fanout exchange, որոնք 1:1 կապված են ուղենիշի հետ։ Հիշենք, որ fanout exchange ամենաարագն է։

Եթե երթուղիների թիվը հասնում է անվերջի, ապա արժե ուշադրություն դարձնել topic exchange կամ, եթե նմուշը պետք չէ, ապա կարելի է ընտրել direct exchange, քանի որ այն ավելի արագ է topic exchange.

Տարբեր կոմբինացիաների exchange պետք է օգնի գտնել ճիշտ ացածողական կոնֆիգուրացիա, որը բավարարում է ինչպես ներկայիս, այնպես էլ աճի պահանջներին համակարգի։

Քանակը exchange և հերթերի թիվը պետք է նվազագույն լինի՝ ի համեմատ երթուղիների թվի։

Հաջորդ հոդվածում սկսելու ենք մանրամասնել Queues և Bindings։

Հղումներ

Ընտանիք: habr.com

Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով 🔥 Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով | ProHoster