Când consumatorul primește mesajul și sarcina de procesare este finalizată, va trimite un ack cu acest identificator de mesaj pentru a informa serverul că mesajul a fost primit și procesarea este finalizată. RabbitMQ așteaptă până când legătura consumatorului care procesează un mesaj este pierdută înainte de a determina că mesajul nu a fost procesat corect, astfel încât RabbitMQ retransmite mesajul. Confirmarea mesajului este dezactivată implicit. Există un parametru noAck când inițializezi Consumer,Dacă este setat pe true, consumatorul va returna un ack imediat ce primește mesajul。
În general, scenariul folosit frecvent este setat ca adevărat, dar pentru proiecte cu cerințe de risc ridicat, cum ar fi plățile. Pentru fiecare mesaj, trebuie să ne asigurăm integritatea și corectitudinea acestuia. După ce primești mesajul, trebuie să confirmi că logica de business corectă este executată și apoi să returnezi activ un ack către server. Poți vizualiza mesajele din coadă prin comanda rabbitmqctl list_queues nume message_rady message_unacknowleded sau prin interfața de gestionare a fundalului.
Dacă noAck este setat pe false, clientul trebuie să trimită activ un ack către server, iar dacă clientul nu confirmă mesajul, va apărea următoarea situație:
Atâta timp cât programul rulează în continuare, aceste 10 mesaje rămân neactivate și nu pot fi relivrate de RabbitMQ. Ce este și mai puternic este căConsumul mesajelor RabbitMQ nu are un mecanism de timeout, adică, dacă programul nu este repornit, mesajul va fi întotdeauna în starea Uncked. Nu uita aceste mesaje de stare neverificată când lucrezi la evenimente operaționale.
Gata
Mesajele cu această stare există în coadă pentru a fi procesate.
Neconfirmat
Un mesaj în această stare indică faptul că este deja procesat, dar nu este confirmat.
Când programul este închis (atâta timp cât Consumatorul este închis), aceste 10 mesaje vor reveni în starea Pregătit.
Mesaj de confirmare
Ce se întâmplă dacă clientul trimite un ack către server? Adică, să confirme primirea mesajului? Codul este următorul:
Când al doilea parametru al metodei BasicAck, multiple, este setat pe false, înseamnă că RabbitMQ este notificat că mesajul curent a fost confirmat.Dacă este adevărat, un mesaj suplimentar mai mic decât eticheta de livrare specificată de primul parametru va fi recunoscut。 (Confirmarea în masă este pentru întregul canal)
Anulare confirmare
Ce se întâmplă dacă unul dintre clienții programului distribuit are o excepție și dorește să anuleze confirmarea mesajului și să lase alți clienți să proceseze mesajul?
Când există o excepție în mesajul de consum, trebuie să anulăm confirmarea, iar apoi putem folosi metoda basicReject a Channel.
Primul parametru specifică eticheta de livrare, iar al doilea parametru descrie modul de gestionare a acestui mesaj de eșec.O valoare de true înseamnă că mesajul este pus înapoi în antetul cozii, iar o valoare de false înseamnă că mesajul este abandonat。
|