Όταν ο καταναλωτής λάβει το μήνυμα και ολοκληρωθεί η εργασία επεξεργασίας, θα στείλει ένα μήνυμα με αυτό το αναγνωριστικό μηνύματος για να ενημερώσει τον διακομιστή ότι το μήνυμα έχει ληφθεί και η επεξεργασία έχει ολοκληρωθεί. Το RabbitMQ περιμένει μέχρι να χαθεί ο σύνδεσμος του καταναλωτή που επεξεργάζεται ένα μήνυμα προτού διαπιστώσει ότι το μήνυμα δεν υποβλήθηκε σε σωστή επεξεργασία, επομένως το RabbitMQ αναμεταδίδει το μήνυμα. Η επιβεβαίωση μηνύματος είναι απενεργοποιημένη από προεπιλογή. Υπάρχει μια παράμετρος noAck κατά την προετοιμασία του Consumer,Εάν οριστεί σε true, ο καταναλωτής θα επιστρέψει ένα ack μόλις λάβει το μήνυμα。
Σε γενικές γραμμές, το συνήθως χρησιμοποιούμενο σενάριο noack είναι γενικά αληθές, αλλά για έργα με απαιτήσεις υψηλού κινδύνου, όπως η πληρωμή. Για κάθε μήνυμα, πρέπει να διασφαλίζουμε την ακεραιότητα και την ορθότητά του. Αφού λάβετε το μήνυμα, πρέπει να επιβεβαιώσετε ότι εκτελείται η σωστή επιχειρηματική λογική και, στη συνέχεια, να επιστρέψετε ενεργά ένα ack στο διακομιστή. Μπορείτε να προβάλετε τα μηνύματα στην ουρά μέσω της εντολής rabbitmqctl list_queues όνομα message_rady message_unacknowleded ή μέσω της διεπαφής διαχείρισης παρασκηνίου.
Εάν το noAck έχει οριστεί σε false, ο υπολογιστής-πελάτης πρέπει να στείλει ενεργά ένα ack στον διακομιστή και εάν ο υπολογιστής-πελάτης δεν επιβεβαιώσει το μήνυμα, θα προκύψει η ακόλουθη κατάσταση:
Όσο το πρόγραμμα εξακολουθεί να εκτελείται, αυτά τα 10 μηνύματα παραμένουν ακάλυπτα και δεν μπορούν να παραδοθούν ξανά από το RabbitMQ. Αυτό που είναι ακόμα πιο ισχυρό είναι ότιΗ κατανάλωση μηνυμάτων RabbitMQ δεν διαθέτει μηχανισμό χρονικού ορίου, δηλαδή, εάν δεν γίνει επανεκκίνηση του προγράμματος, το μήνυμα θα βρίσκεται πάντα σε κατάσταση Unacked. Μην ξεχνάτε αυτά τα μηνύματα κατάστασης όταν εργάζεστε σε συμβάντα επιχειρήσεων.
Ετοιμος
Τα μηνύματα με αυτήν την κατάσταση υπάρχουν στην ουρά προς επεξεργασία.
Μη αναγνωρισμένο
Ένα μήνυμα σε αυτήν την κατάσταση υποδεικνύει ότι βρίσκεται ήδη υπό επεξεργασία αλλά δεν έχει επιβεβαιωθεί.
Όταν το πρόγραμμα κλείσει (όσο ο καταναλωτής είναι κλειστός), αυτά τα 10 μηνύματα θα επιστρέψουν στην κατάσταση ετοιμότητας.
Μήνυμα επιβεβαίωσης
Τι γίνεται αν ο πελάτης στείλει ένα ack στον διακομιστή; Δηλαδή να επιβεβαιώσετε τη λήψη του μηνύματος; Ο κωδικός έχει ως εξής:
Όταν η δεύτερη παράμετρος της μεθόδου BasicAck, πολλαπλή, έχει οριστεί σε false, σημαίνει ότι το RabbitMQ ειδοποιείται ότι το τρέχον μήνυμα έχει επιβεβαιωθεί.Εάν είναι αληθές, θα επιβεβαιωθεί ένα επιπλέον μήνυμα μικρότερο από την ετικέτα παράδοσης που καθορίζεται από την πρώτη παράμετρο。 (Η μαζική επιβεβαίωση αφορά ολόκληρο το κανάλι)
Ακύρωση επιβεβαίωσης
Τι γίνεται αν ένας από τους πελάτες του διανεμημένου προγράμματος έχει μια εξαίρεση και θέλει να ακυρώσει την επιβεβαίωση του μηνύματος και να αφήσει άλλους πελάτες να επεξεργαστούν το μήνυμα;
Όταν υπάρχει εξαίρεση στο μήνυμα κατανάλωσης, πρέπει να ακυρώσουμε την επιβεβαίωση και, στη συνέχεια, μπορούμε να χρησιμοποιήσουμε τη βασική μέθοδο απόρριψης του καναλιού.
Η πρώτη παράμετρος καθορίζει την ετικέτα παράδοσης και η δεύτερη παράμετρος περιγράφει τον τρόπο χειρισμού αυτού του μηνύματος αποτυχίας.Η τιμή true σημαίνει ότι το μήνυμα τοποθετείται ξανά στην κεφαλίδα της ουράς και η τιμή false σημαίνει ότι το μήνυμα εγκαταλείπεται。
|