RabbitMQ. ნაწილი 2. გაცვლების გაგება

Exchange - გადამცვლელი ან გაცვლის წერტილი. მასზე მესიჯები იგზავნება. Exchange ავრცელებს შეტყობინებას ერთ ან რამდენიმე რიგში. ის აგზავნის შეტყობინებებს რიგში შექმნილი ბმულების საფუძველზე (bindings) მასსა და რიგს შორის.

Exchange არ არის ერლანგის პროცესი. მასშტაბურობის მიზეზების გამო exchange არის სტრიქონი (მოდულის ბმული კოდით, სადაც არის მარშრუტიზაციის ლოგიკა) ჩაშენებულ მონაცემთა ბაზაში მნეზია. 1 ათასი გადამცვლელი მოიხმარს მხოლოდ 1 მბ მეხსიერებას.

სარჩევი

  • RabbitMQ. ნაწილი 1. შესავალი. Erlang, AMQP და RPC
  • RabbitMQ. ნაწილი 2. გაცვლების გაგება
  • RabbitMQ. ნაწილი 3. რიგების და აკინძების გაგება
  • RabbitMQ. ნაწილი 4. საქმე რა არის შეტყობინებები და ჩარჩოები
  • RabbitMQ. ნაწილი 5: შეტყობინებების გამოქვეყნება და გამოყენება
  • RabbitMQ. ნაწილი 6. ფედერაციისა და შოველ მოდულების მიმოხილვა
  • RabbitMQ. ნაწილი 7. დეტალები კავშირისა და შანელის შესახებ
  • 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 Exchange

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.კლიენტი:

//...
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 შეიძლება მხოლოდ ლოკალჰოსტიდან დაკავშირება. ახლა მოდით გადავიდეთ ჩანართზე Exchanges და დააწკაპუნეთ Add a new exchange. შეავსეთ თვისებები:

RabbitMQ. ნაწილი 2. გაცვლების გაგება

თვისებების უმეტესობა აღწერილია ზემოთ. აქვე აღვნიშნავთ, რომ თუ დავაყენებთ Internal, მაშინ გაცვლა შეიძლება გამოყენებულ იქნას მხოლოდ E2E. Producer ვერ შეძლებს შეტყობინებების გაგზავნას ასეთ ბირჟაზე.

დასკვნა

სისტემის შემუშავებისას მოსახერხებელია ტოპოლოგიის აღწერა მარშრუტიზაცია გრაფიკის გამოყენებით. მაგრამ სანამ გრაფიკის შექმნას დაიწყებთ, ღირს ხაზგასმით აღვნიშნოთ მაღალი ტრაფიკის მქონე ბილიკები, რადგან. ისინი მოითხოვენ უმაღლესი გამტარუნარიანობა (შესრულება). შემდეგი, შეგიძლიათ ტრაფიკის კლასიფიკაცია. და შემდეგ დაიწყე მშენებლობა.

თუ აგებულ გრაფიკში არსებობს სასრულ ნაკრები მარშრუტიზაციის გასაღებები, მაშ, ღირს რამდენიმესკენ მიხედვა fanout exchange, რომლებიც 1:1 დაკავშირებულია მარშრუტიზაციის გასაღებთან. ჩვენ ეს გვახსოვს fanout exchange უსწრაფესი.

თუ მარშრუტების რაოდენობა მიდრეკილია უსასრულობისკენ, მაშინ ყურადღება უნდა მიაქციოთ topic exchange ან, თუ შაბლონი არ არის საჭირო, მაშინ შეგიძლიათ აირჩიოთ direct exchnge, იმიტომ ის უფრო სწრაფია topic exchange.

სხვადასხვა კომბინაციები exchange უნდა დაგეხმაროთ სწორის პოვნაში. მასშტაბირებადი კონფიგურაცია, რომელიც აკმაყოფილებს როგორც მიმდინარე, ისე მზარდი სისტემის მოთხოვნებს.

ხმების exchange ხოლო რიგები მინიმალური უნდა იყოს მარშრუტების რაოდენობასთან შედარებით.

მომდევნო სტატიაში უფრო დეტალურად დავიწყებთ რიგების და აკინძების გაგებას.

ლიტერატურა

წყარო: www.habr.com

ახალი კომენტარის დამატება