RabbitMQ. Μέρος 2. Κατανόηση των ανταλλαγών

Exchange - εναλλάκτη ή σημείο ανταλλαγής. Του αποστέλλονται μηνύματα. Exchange διανέμει το μήνυμα σε μία ή περισσότερες ουρές. Αυτός δρομολογεί μηνύματα σε μια ουρά με βάση τους δημιουργημένους συνδέσμους (bindings) μεταξύ αυτού και της ουράς.

Exchange δεν είναι διαδικασία Erlang. Για λόγους επεκτασιμότητας exchange είναι μια συμβολοσειρά (ένας σύνδεσμος προς τη μονάδα με τον κώδικα όπου βρίσκεται η λογική δρομολόγησης) στην ενσωματωμένη βάση δεδομένων μνησία. 1 εναλλάκτες θα καταναλώσουν μόνο 1MB μνήμης.

πίνακας περιεχομένων

  • 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 μπορούμε να βρούμε τη σωστή κλιμακούμενη διαμόρφωση που να ανταποκρίνεται τόσο στις τρέχουσες όσο και στις αυξανόμενες απαιτήσεις.

Δημιουργήστε ένα Exchange

Ο εναλλάκτης δημιουργείται χρησιμοποιώντας ένα σύγχρονο 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

Μεταβείτε στον πίνακα διαχείρισης 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 και οι ουρές θα πρέπει να είναι ελάχιστες σε σύγκριση με τον αριθμό των διαδρομών.

Στο επόμενο άρθρο, θα αρχίσουμε να καταλαβαίνουμε περισσότερα για τις ουρές και τις δεσμεύσεις.

παραπομπές

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο