När konsumenten tar emot meddelandet och bearbetningsuppgiften är slutförd, skickar den en ack med denna meddelandeidentifierare för att tala om för servern att meddelandet har mottagits och att bearbetningen är klar. RabbitMQ väntar tills länken till konsumenten som bearbetar ett meddelande förloras innan den fastställer att meddelandet inte behandlades korrekt, så RabbitMQ skickar meddelandet på nytt. Meddelandebekräftelse är avstängd som standard. Det finns en noAck-parameter vid initiering av Consumer,Om den sätts till true kommer konsumenten att returnera en ack så snart den tar emot meddelandet。
Generellt sett är det ofta använda scenariot noack oftast satt till sann, men för projekt med höga riskkrav, såsom betalning. För varje meddelande måste vi säkerställa dess integritet och korrekthet. Efter att ha fått meddelandet måste du bekräfta att rätt affärslogik körs och sedan aktivt returnera en ack till servern. Du kan se meddelandena i kön via rabbitmqctl list_queues namn message_rady message_unacknowleded kommando, eller via bakgrundshanteringsgränssnittet.
Om noAck är satt till false måste klienten aktivt skicka en ack till servern, och om klienten inte bekräftar meddelandet uppstår följande situation:
Så länge programmet fortfarande körs förblir dessa 10 meddelanden ouppfyllda och kan inte levereras om av RabbitMQ. Det som är ännu kraftfullare är attRabbitMQ-meddelandekonsumtion har ingen timeout-mekanism, det vill säga, om programmet inte startas om, kommer meddelandet alltid att vara i Unacked-tillståndet. Glöm inte dessa utsatta delstatsmeddelanden när du arbetar med operationshändelser.
Redo
Meddelanden med denna status finns i kön som ska behandlas.
Obekräftat
Ett meddelande i denna status indikerar att det redan behandlas men inte bekräftas.
När programmet är stängt (så länge konsumenten är stängd) kommer dessa 10 meddelanden att återgå till Ready-tillståndet.
Bekräftelsemeddelande
Vad händer om klienten skickar en ack till servern? Det vill säga, bekräfta mottagandet av meddelandet? Koden är följande:
När den andra parametern i BasicAck-metoden, multipel, sätts till false, betyder det att RabbitMQ meddelas att det aktuella meddelandet har bekräftats.Om det är sant kommer ett ytterligare meddelande som är mindre än leveranstaggen som anges av den första parametern att bekräftas。 (Massbekräftelse gäller hela kanalen)
Avbryt bekräftelsen
Vad händer om en av klienterna i det distribuerade programmet har ett undantag och vill avbryta bekräftelsen av meddelandet och låta andra klienter bearbeta meddelandet?
När det finns ett undantag i konsumtionsmeddelandet behöver vi avbryta bekräftelsen, och sedan kan vi använda basicReject-metoden i Channel.
Den första parametern specificerar leveranstaggen, och den andra parametern beskriver hur detta felmeddelande ska hanteras.Ett värde på true betyder att meddelandet läggs tillbaka i köheadern, och ett värde false betyder att meddelandet överges。
|