Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 44647|Απάντηση: 8

[Φόρμα Win] rabbitMQ Queue Queue Message Persistence [με πηγαίο κώδικα]

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 9/4/2018 10:23:21 π.μ. | | | |
Από προεπιλογή, τα μηνύματα ουράς rabbitMQ δεν διατηρούνται στον σκληρό δίσκο, πράγμα που σημαίνει ότι μόλις γίνει επανεκκίνηση της υπηρεσίας rabbitMQ, τα μηνύματα θα χαθούν.

Διατήρηση ουρών

Για παράδειγμα, προσδιορίζεται η διατήρηση της ουράςdurableέχει οριστεί σε true, που σημαίνει ότι είναι μια μόνιμη ουράκαι, στη συνέχεια, μετά την επανεκκίνηση της υπηρεσίας, θα υπάρχει επίσης, επειδή η υπηρεσία θα αποθηκεύσει την ουρά που διατηρείται στον σκληρό δίσκο και όταν γίνει επανεκκίνηση της υπηρεσίας, θα αποκαταστήσει την ουρά που είχε διατηρηθεί προηγουμένως. Η ουρά μπορεί να διατηρηθεί, αλλά το αν τα μηνύματα μέσα είναι μόνιμα εξαρτάται από τις ρυθμίσεις επιμονής του μηνύματος. Με άλλα λόγια, εάν δεν έχει σταλεί μήνυμα στην ουρά πριν από την επανεκκίνηση, εάν το αρχικό μήνυμα εξακολουθεί να υπάρχει στην ουρά μετά την επανεκκίνηση εξαρτάται από τις ρυθμίσεις μηνυμάτων που προέκυψαν κατά την αποστολή του μηνύματος.
Εάν θέλετε να διατηρήσετε τα μηνύματα μόνιμα μετά από επανεκκίνηση, πρέπει να ορίσετε την ταυτότητα ότι το μήνυμα διατηρείται.

Ρύθμιση διατήρησης ουράς:




Η τέταρτη παράμετρος της μεθόδου, autoDelete, συνήθως εισάγεται false. Η τεκμηρίωση περιγράφει αυτή την παράμετρο εάν είναι αληθής, πράγμα που σημαίνει ότι εάν η ουρά δεν χρησιμοποιείται πλέον (δεν είναι εγγεγραμμένη), ο διακομιστής θα τη διαγράψει. Κατά τη διάρκεια της δοκιμής μου, εφόσον όλοι οι παραλήπτες της ουράς αλλαγής σύνδεσης είναι αποσυνδεδεμένοι, η ουρά διαγράφεται, ακόμα κι αν εξακολουθούν να υπάρχουν μη επεξεργασμένα μηνύματα σε αυτήν. Οι επανεκκινήσεις του RabbitMQ θα τα αφαιρέσουν επίσης. Εάν εισαχθεί false, η υπηρεσία δεν θα διαγράψει την ουρά και τα μηνύματα στην ουρά θα υπάρχουν εάν αποσυνδεθούν όλοι οι πελάτες που είναι συνδεδεμένοι σε αυτήν. Ο αποστολέας μπορεί επίσης να βάλει μηνύματα στην ουρά αλλαγών όταν δεν υπάρχει σύνδεση πελάτη και όταν εμφανιστεί ο πελάτης, θα λάβει αυτά τα μηνύματα. Ωστόσο, εάν γίνει επανεκκίνηση της υπηρεσίας RabbitMQ, η ουρά θα εξαφανιστεί και τα μηνύματα σε αυτήν θα εξαφανιστούν φυσικά.

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

Η δεύτερη παράμετρος, ανθεκτική, περιγράφεται στην τεκμηρίωση λέγοντας ότι εάν είναι αληθής, αντιπροσωπεύει μια μόνιμη ουρά, η οποία θα υπάρχει επίσης μετά την επανεκκίνηση της υπηρεσίας. Επειδή η υπηρεσία θα αποθηκεύσει τη μόνιμη ουρά στον σκληρό δίσκο και όταν γίνει επανεκκίνηση της υπηρεσίας, θα επιβεβαιώσει εκ νέου αυτήν την ουρά. Φυσικά, πρέπει να συμβαίνει όταν τόσο η αυτόματη διαγραφή όσο και η αποκλειστική είναι ψευδείς. Η ουρά μπορεί να διατηρηθεί, αλλά το αν τα μηνύματα μέσα είναι μόνιμα εξαρτάται από τις ρυθμίσεις επιμονής του μηνύματος. Με άλλα λόγια, εάν εξακολουθούν να αποστέλλονται μηνύματα στην ουρά πριν από την επανεκκίνηση, εάν το αρχικό μήνυμα εξακολουθεί να υπάρχει στην ουρά μετά την επανεκκίνηση εξαρτάται από τις ρυθμίσεις του αποστολέα για το μήνυμα κατά την αποστολή του μηνύματος.


Αφού τροποποιήσουμε τον κώδικα, προσπαθούμε να τον εκτελέσουμε και το σφάλμα θα είναι το εξής:

Μη χειριζόμενη εξαίρεση: RabbitMQ.Client.Exceptions.OperationInterruptedException: Η λειτουργία AMQP διακόπηκε: AMQP close-reason, που ξεκίνησε από τον Peer, code=406, text="PRECONDITION_FAILED - ανισοδύναμο arg 'durable' για ουρά 'hello' στο vhost 'myserver': έλαβε 'true' αλλά το τρέχον είναι 'false'", classId=50, methodId=10, cause=



Επειδή έχουμε ορίσει μια μη μόνιμη ουρά που ονομάζεται hello. Το RabbitMQ δεν επιτρέπει τον επαναπροσδιορισμό υπαρχουσών ουρών με διαφορετικές ρυθμίσεις παραμέτρων.

Υπάρχουν δύο λύσεις:

1: Δηλώστε ξανά μια ουρά με διαφορετικό όνομα, όπως my_queue
2: Διαγράψτε την καθορισμένη ουρά "hello" με τη διεύθυνση του http://localhost:15672 και συνδεθείτε με το όνομα χρήστη και τον κωδικό πρόσβασης. Ο προεπιλεγμένος κωδικός πρόσβασης και το όνομα χρήστη για το RabbitMQ είναι επισκέπτης. Κάντε κλικ στη στήλη "ουρά" για να δείτε τη λίστα ουράς, κάντε κλικ στην ουρά "γεια" για να αναπτύξετε τις λεπτομέρειες της ουράς. Τραβήξτε τη σελίδα μέχρι το τέλος, υπάρχει ένα στοιχείο "Διαγραφή", κάντε κλικ σε αυτό, κάντε κλικ στο κουμπί "Διαγραφή ουράς" και μπορείτε να διαγράψετε την ουρά. Στη συνέχεια, όταν εκτελείται ο κώδικας, δημιουργείται μια ουρά hello που υποστηρίζει την επιμονή.



Διατήρηση μηνυμάτων

Εάν θέλετε να διατηρήσετε το μήνυμα μόνιμο μετά από επανεκκίνηση, πρέπει να ρυθμίσετε το μήνυμα σε μόνιμο. Η ρύθμιση είναι όταν το στέλνει ο αποστολέας, κάτι που είναι σχετικά απλό και ο κωδικός έχει ως εξής:


Το DeliveryMode έχει οριστεί από προεπιλογή σε 1, μη μόνιμο και η ρύθμιση σε 2 σημαίνει ότι το μήνυμα είναι μόνιμο

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

(Τέλος)

Επισυνάπτεται ο πηγαίος κώδικας C#:

Τουρίστες, αν θέλετε να δείτε το κρυφό περιεχόμενο αυτής της ανάρτησης, παρακαλώΑπάντηση





Προηγούμενος:Μήνυμα εξαίρεσης: "StrongTypingException: IsPrima...
Επόμενος:Εισαγωγή στους αντιπροσώπους C# (εκπρόσωπος, Δράση, Func, κατηγόρημα)
Δημοσιεύτηκε στις 9/4/2018 1:17:51 μ.μ. |
Μαθαίνω να μαθαίνω
Δημοσιεύτηκε στις 25/6/2019 11:22:47 μ.μ. |
Μαθαίνω να μαθαίνω
Δημοσιεύτηκε στις 29/6/2019 9:36:23 π.μ. |
Γιατί δεν είδα το demo, πρέπει να απαντήσω για να το δω
Δημοσιεύτηκε στις 9/7/2019 5:34:42 μ.μ. |
Θέλω πηγαίο κώδικα C#
Δημοσιεύτηκε στις 24/7/2019 2:21:51 μ.μ. |
Είναι καλό, είναι ακριβώς αυτό που χρειάζομαι
Δημοσιεύτηκε στις 11/4/2020 2:34:54 μ.μ. |
Μάθε το
Δημοσιεύτηκε στις 1/1/2022 2:45:24 μ.μ. |
1111111111111111
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 3/5/2023 10:12:22 μ.μ. |
Παράμετροι της ουράς του RabbitMQ και οι έννοιές τους


/**
* Κατασκευάστε μια νέα ουρά, με όνομα, σημαία ανθεκτικότητας και σημαία αυτόματης διαγραφής και ορίσματα.
* @param ονομάσετε το όνομα της ουράς - δεν πρέπει να είναι μηδενικό. ορίστε σε "" για να δημιουργήσει ο μεσίτης το όνομα.
* @param ισχύει αν δηλώνουμε μια ανθεκτική ουρά (η ουρά θα επιβιώσει μετά την επανεκκίνηση του διακομιστή)
* @param αποκλειστική αληθής εάν δηλώνουμε μια αποκλειστική ουρά (η ουρά θα χρησιμοποιηθεί μόνο από τον δηλούντα
* σύνδεση)
* @param autoDelete true εάν ο διακομιστής πρέπει να διαγράψει την ουρά όταν δεν χρησιμοποιείται πλέον
* @param ορίσματα που χρησιμοποιήθηκαν για τη δήλωση της ουράς
*/
public Queue(Όνομα συμβολοσειράς, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) {
   Assert.notNull(όνομα, "το 'όνομα' δεν μπορεί να είναι null");
   this.name = όνομα;
   this.actualName = StringUtils.hasText(όνομα) ? Όνομα
         : (Base64UrlNamingStrategy.DEFAULT.generateName() + "_awaiting_declaration");
   this.durable = ανθεκτικό;
   this.exclusive = αποκλειστικό;
   this.autoDelete = αυτόματη διαγραφή;
   this.arguments = arguments != null ? ορίσματα : νέο HashMap<>();
}

Εισαγωγή παραμέτρων:
1. Όνομα: το όνομα της ουράς.
2. actualName: Το πραγματικό όνομα της ουράς, η παράμετρος ονόματος χρησιμοποιείται από προεπιλογή, εάν το όνομα είναι κενό, δημιουργείται ένα σύμφωνα με τους κανόνες.
3. Ανθεκτικό: είτε είναι επίμονο.
4. Αποκλειστικό: είτε είναι αποκλειστικό είτε αποκλειστικό.
5. Αυτόματη διαγραφή: εάν θα διαγραφεί αυτόματα.
6. Ορίσματα: Άλλες παράμετροι χαρακτηριστικών της ουράς έχουν τις ακόλουθες επιλογές, δείτε Επιχειρήματα στο Σχήμα 2:
(1) x-message-ttl: ο χρόνος λήξης του μηνύματος, σε χιλιοστά του δευτερολέπτου.
(2) x-expires: χρόνος λήξης ουράς, πόσο καιρό θα διαγραφεί η ουρά εάν δεν γίνει πρόσβαση, μονάδα: χιλιοστά του δευτερολέπτου.
(3) x-max-length: το μέγιστο μήκος της ουράς, εάν υπερβαίνει τη μέγιστη τιμή, το μήνυμα θα διαγραφεί από την κεφαλίδα της ουράς.
(4) x-max-length-bytes: το περιεχόμενο του μηνύματος ουράς καταλαμβάνει τον μέγιστο χώρο, που περιορίζεται από το μέγεθος της μνήμης, και εάν υπερβεί αυτό το όριο, το μήνυμα θα διαγραφεί από την κεφαλίδα της ουράς.
(5) x-overflow: Ορίστε τη συμπεριφορά υπερχείλισης ουράς. Αυτό καθορίζει τι θα συμβεί στο μήνυμα όταν συμπληρωθεί το μέγιστο μήκος της ουράς. Οι έγκυρες τιμές είναι drop-head, reject-publish ή reject-publish-dlx. Οι τύποι ουράς απαρτίας υποστηρίζουν μόνο drop-head.
(6) ανταλλαγή νεκρών γραμμάτων: το όνομα της ανταλλαγής νεκρών γραμμάτων και τα μηνύματα που έχουν λήξει ή διαγραφεί (λόγω του μεγάλου μήκους της σειράς αναμονής ή του διαστήματος που υπερβαίνει το όριο) μπορούν να καθοριστούν για αποστολή στο κέντρο ανταλλαγής·
(7) x-dead-letter-routing-key: Το κλειδί δρομολόγησης του μηνύματος νεκρού γράμματος, το οποίο θα χρησιμοποιηθεί όταν το μήνυμα αποστέλλεται στον εναλλάκτη νεκρών γραμμάτων, εάν δεν έχει οριστεί, θα χρησιμοποιηθεί η αρχική τιμή του κλειδιού δρομολόγησης του μηνύματος
(8) x-single-active-consumer: υποδεικνύει εάν η ουρά είναι ένας μεμονωμένος ενεργός καταναλωτής, εάν είναι αληθές, μόνο ένας καταναλωτής στην εγγεγραμμένη ομάδα καταναλωτών καταναλώνει μηνύματα, οι άλλοι αγνοούνται και false όταν το μήνυμα διανέμεται σε όλους τους καταναλωτές σε βρόχο (προεπιλογή false)
(9) x-max-priority: ο μέγιστος αριθμός προτεραιοτήτων που πρέπει να υποστηριχθούν από τη σειρά αναμονής· Εάν δεν οριστεί, η ουρά δεν θα υποστηρίζει προτεραιότητα μηνύματος.
(10) x-queue-mode (Lazy mode): Ρυθμίστε την ουρά σε λειτουργία καθυστέρησης, κρατήστε όσο το δυνατόν περισσότερα μηνύματα στο δίσκο για να μειώσετε τη χρήση της μνήμης RAM. Εάν δεν οριστεί, η ουρά θα διατηρήσει μια προσωρινή μνήμη για την παράδοση μηνυμάτων όσο το δυνατόν γρηγορότερα.
(11) x-queue-master-locator: Ρυθμίστε τις πληροφορίες του κύριου κόμβου της ουράς καθρέφτη σε λειτουργία συμπλέγματος.


Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com