RabbitMQ. Μέρος 1. Εισαγωγή. Erlang, AMQP

Καλησπέρα, Χαμπρ! Θέλω να μοιραστώ ένα σχολικό βιβλίο-βιβλίο αναφοράς γνώσεων που κατάφερα να συγκεντρώσω RabbitMQ και συμπυκνώνονται σε σύντομες συστάσεις και συμπεράσματα.

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

  • 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. Παρακολούθηση

Εν συντομία για το AMQP

Το AMQP (Advanced Message Queuing Protocol) είναι ένα ανοιχτό πρωτόκολλο για τη μετάδοση μηνυμάτων μεταξύ των στοιχείων του συστήματος. Η βασική ιδέα είναι ότι μεμονωμένα υποσυστήματα (ή ανεξάρτητες εφαρμογές) μπορούν να ανταλλάσσουν μηνύματα με αυθαίρετο τρόπο μέσω ενός μεσίτη AMQP, ο οποίος εκτελεί δρομολόγηση, πιθανώς εγγυάται την παράδοση, διανέμει ροές δεδομένων και εγγράφεται στους επιθυμητούς τύπους μηνυμάτων.

Πρωτόκολλο AMQP εισάγει τρεις έννοιες:

RabbitMQ. Μέρος 1. Εισαγωγή. Erlang, AMQP

  • exchange (σημείο ανταλλαγής ή ανταλλαγή) - αποστέλλονται μηνύματα σε αυτό. Σημείο ανταλλαγής διανέμει το μήνυμα σε μία ή περισσότερες ουρές. Αυτή δρομολογεί μηνύματα σε μια ουρά με βάση τους δημιουργημένους συνδέσμους (binding) μεταξύ αυτού και της ουράς
  • queue (ουρά) - μια δομή δεδομένων στο δίσκο ή στη μνήμη RAM που αποθηκεύει συνδέσμους σε μηνύματα και δίνει αντίγραφα μηνυμάτων consumers (σε καταναλωτές)
  • binding (δεσμευτικό) - κανόνας που λέει στο σημείο ανταλλαγής σε ποια ουρά πρέπει να μπουν αυτά τα μηνύματα

Το πρωτόκολλο τρέχει από πάνω TCP / IP.

Εν συντομία για το Erlang

Ο πηγαίος κώδικας του έργου βρίσκεται στο αποθετήριο στη διεύθυνση GitHub. Αρχιτεκτονική Διακομιστής RabbitMQ βασισμένο στο Ερλάνγκ και ΔΟΚΟΣ.

Erlang που αναπτύχθηκε από την εταιρεία Ericsson στα μέσα της δεκαετίας του 1980 ως ένα κατανεμημένο, ανεκτικό σε σφάλματα σύστημα σε πραγματικό χρόνο για εφαρμογές που απαιτούν 99,999% χρόνο λειτουργίας. Erlang χρησιμοποιείται σε διάφορες βιομηχανίες και σύγχρονες εφαρμογές, π.χ. WhatsApp. Μπορείτε να διαβάσετε περισσότερα στο άρθρο Αρχιτεκτονική WhatsApp, την οποία αγόρασε το Facebook για 19 δισεκατομμύρια δολάρια

Εν συντομία για το RabbitMQ

RabbitMQ είναι ένας μεσίτης μηνυμάτων ανοιχτού κώδικα. Δρομολογεί μηνύματα σε όλες τις βασικές αρχές του πρωτοκόλλου AMQP περιγράφεται στο Προδιαγραφές. RabbitMQ εφαρμόζει και συμπληρώνει το πρωτόκολλο AMQP.

Η κύρια ιδέα του μοντέλου ανταλλαγής μηνυμάτων RabbitMQ το πράγμα είναι producer (εκδότης) δεν στέλνει μηνύματα απευθείας στην ουρά. Στην πραγματικότητα, και πολύ συχνά, ο εκδότης δεν γνωρίζει καν αν το μήνυμα θα παραδοθεί σε οποιαδήποτε ουρά.

Αντίθετα, ο εκδότης μπορεί να στείλει μηνύματα μόνο στην ανταλλαγή. Από τη μια πλευρά, η ανταλλαγή λαμβάνει μηνύματα από εκδότες και από την άλλη, τα στέλνει σε ουρές. Η ανταλλαγή πρέπει να γνωρίζει ακριβώς τι να κάνει με το μήνυμα που λαμβάνει. Πρέπει να προστεθεί σε μια συγκεκριμένη ουρά; Πρέπει να προστεθεί σε πολλές ουρές; Ή το μήνυμα θα πρέπει να αγνοηθεί.

RabbitMQ. Μέρος 1. Εισαγωγή. Erlang, AMQP

Σύντομη εργασία RabbitMQ μπορεί να περιγραφεί ως εξής:

  1. Ο εκδότης στέλνει ένα μήνυμα σε μια συγκεκριμένη ανταλλαγή
  2. Μια ανταλλαγή, έχοντας λάβει ένα μήνυμα, το δρομολογεί σε μία ή περισσότερες ουρές σύμφωνα με τους δεσμευτικούς κανόνες μεταξύ αυτού και της ουράς
  3. Η ουρά αποθηκεύει μια αναφορά σε αυτό το μήνυμα. Το ίδιο το μήνυμα αποθηκεύεται στη μνήμη RAM ή στο δίσκο
  4. Μόλις ο καταναλωτής είναι έτοιμος να λάβει ένα μήνυμα από την ουρά, ο διακομιστής δημιουργεί ένα αντίγραφο του μηνύματος μέσω του συνδέσμου και στέλνει
  5. Ο καταναλωτής λαμβάνει το μήνυμα και στέλνει επιβεβαίωση στον μεσίτη
  6. Ο μεσίτης, μόλις λάβει την επιβεβαίωση, αφαιρεί ένα αντίγραφο του μηνύματος από την ουρά. Στη συνέχεια διαγράφει από τη μνήμη RAM και το δίσκο

RPC

διαδικασία RPC (κλήση απομακρυσμένης διαδικασίας) βρίσκεται κάτω από όλες σχεδόν τις αλληλεπιδράσεις με τον πυρήνα RabbitMQ. Για παράδειγμα, αρχικές συζητήσεις σχετικά με τους όρους του πελάτη με RabbitMQ, δείχνει μια συγκεκριμένη διαδικασία RPC. Μόλις ολοκληρωθεί αυτή η σειρά, RabbitMQ θα είναι έτοιμο να δεχτεί αιτήματα από τον πελάτη:

RabbitMQ. Μέρος 1. Εισαγωγή. Erlang, AMQP

Επίσης στις προδιαγραφές AMQP τόσο ο πελάτης όσο και ο διακομιστής μπορούν να εκδώσουν εντολές. Αυτό σημαίνει ότι ο πελάτης περιμένει να επικοινωνήσει με τον διακομιστή. Οι εντολές είναι κλάσεις και μέθοδοι. Για παράδειγμα, Connection.Start – κλήση μεθόδου Start κατηγορία Connection.

Σύνδεση και κανάλια

Για μια τέτοια ανταλλαγή πληροφοριών μεταξύ πελάτη και διακομιστή, κανάλια. Τα κανάλια δημιουργούνται μέσα συγκεκριμένη σύνδεση. Κάθε κανάλι είναι απομονωμένο από άλλα κανάλια. Στη σύγχρονη περίπτωση, δεν είναι δυνατή η εκτέλεση της επόμενης εντολής έως ότου ληφθεί μια απάντηση.

Για να μπορείτε να στέλνετε εντολές παράλληλα, πρέπει να ανοίξετε πολλά κανάλια. Κάθε κανάλι δημιουργεί ένα ξεχωριστό Erlang επεξεργάζομαι, διαδικασία. Μία σύνδεση μπορεί να έχει πολλά κανάλια (πολυπλεξίας). Για κάθε κανάλι υπάρχουν συγκεκριμένες δομές και αντικείμενα στη μνήμη. Επομένως, όσο περισσότερα κανάλια υπάρχουν σε μια σύνδεση, τόσο Το RabbitMQ χρησιμοποιεί περισσότερη μνήμη για τη διαχείριση μιας τέτοιας σύνδεσης.

RabbitMQ. Μέρος 1. Εισαγωγή. Erlang, AMQP

Ένα απλό παράδειγμα δημιουργίας σύνδεσης και καναλιού χρησιμοποιώντας RabbitMQ.Πελάτης:

// ...
private void TryConnect()
{
    var factory = new ConnectionFactory() 
    {
        HostName = "host_name",
        UserName = "user_name",
        Password = "p@ssword",
        // Включение автоматичекого восстановления
        // соединения после сбоев сети 
        AutomaticRecoveryEnabled = true
    };
    _connection = factory.CreateConnection();
}
// ...
public void CreateChanel()
{
    _channel = _connection.CreateModel();
    // other options 
}

Το άνοιγμα μιας νέας σύνδεσης για κάθε λειτουργία δεν συνιστάται ιδιαίτερα θα οδηγήσει σε υψηλό κόστος. Τα κανάλια θα πρέπει επίσης να είναι μόνιμα, αλλά πολλά σφάλματα πρωτοκόλλου προκαλούν το κλείσιμο του καναλιού, επομένως η διάρκεια ζωής του καναλιού μπορεί να είναι μικρότερη από αυτή της σύνδεσης.

Πού χρησιμοποιείται το RabbitMQ;

Στο πλαίσιο των μικροϋπηρεσιών, το πρωτόκολλο AMQP και την εφαρμογή του σε RabbitMQ χρησιμοποιείται συχνά για ασύγχρονη αλληλεπίδραση μεταξύ των υπηρεσιών.

Στο κείμενο IIOT πρωτόκολλο AMQP και την εφαρμογή του σε RabbitMQ χρησιμοποιείται για την ανταλλαγή δεδομένων μεταξύ διακομιστών (διακομιστής-διακομιστής). Χρησιμοποιήστε επίσης το πρόσθετο MQTT Plugin RabbitMQ που αποτελεί υλοποίηση του πρωτοκόλλου MQTT για μετάδοση δεδομένων μεταξύ αισθητήρα και διακομιστή σε περιβάλλοντα χαμηλής ταχύτητας και υψηλής καθυστέρησης (μια πλήρης λίστα των υποστηριζόμενων πρωτοκόλλων παρατίθεται στη διεύθυνση τοποθεσία έργου).

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

παραπομπές

Πηγή: www.habr.com

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