Når forbrugeren modtager beskeden, og behandlingsopgaven er fuldført, sender den en ack med denne meddelelsesidentifikator for at fortælle serveren, at beskeden er modtaget og behandlingen er fuldført. RabbitMQ venter, indtil forbindelsen til forbrugeren, der behandler en besked, er gået tabt, før det fastslår, at beskeden ikke blev behandlet korrekt, så RabbitMQ sender beskeden igen. Beskedkvittering er som standard slået fra. Der er en noAck-parameter ved initialisering af Consumer,Hvis den sættes til sand, vil forbrugeren returnere en ack, så snart den modtager beskeden。
Generelt er det almindeligt anvendte scenarie noack sat til sandt, men for projekter med høje risikokrav, såsom betaling. For hver besked skal vi sikre dens integritet og korrekthed. Efter at have modtaget beskeden, skal du bekræfte, at den korrekte forretningslogik er udført, og derefter aktivt returnere en ack til serveren. Du kan se beskederne i køen via rabbitmqctl list_queues navn message_rady message_unacknowleded kommando eller via baggrundsstyringsgrænsefladen.
Hvis noAck er sat til false, skal klienten aktivt sende en ack til serveren, og hvis klienten ikke bekræfter beskeden, vil følgende situation opstå:
Så længe programmet stadig kører, forbliver disse 10 beskeder ufærdige og kan ikke leveres igen af RabbitMQ. Det, der er endnu mere kraftfuldt, er, atRabbitMQ-meddelelsesforbrug har ikke en timeout-mekanisme, det vil sige, hvis programmet ikke genstartes, vil beskeden altid være i Unacked-tilstanden. Glem ikke disse unacked state-beskeder, når du arbejder på operationsevents.
Klar
Beskeder med denne status findes i køen, der skal behandles.
Ukendt
En besked i denne status indikerer, at den allerede er under behandling, men ikke bekræftet.
Når programmet lukkes (så længe Forbrugeren er lukket), vil disse 10 beskeder vende tilbage til Klar-tilstanden.
Bekræftelsesbesked
Hvad hvis klienten sender en ack til serveren? Altså, bekræfte modtagelsen af beskeden? Koden er som følger:
Når den anden parameter i BasicAck-metoden, multipel, sættes til falsk, betyder det, at RabbitMQ får besked om, at den aktuelle besked er blevet bekræftet.Hvis sandt, vil en ekstra besked, der er mindre end leveringstaget, der er angivet af den første parameter, blive bekræftet。 (Massebekræftelse gælder for hele kanalen)
Annuller bekræftelsen
Hvad hvis en af klienterne i det distribuerede program har en undtagelse og vil annullere bekræftelsen af beskeden og lade andre klienter behandle beskeden?
Når der er en undtagelse i forbrugsbeskeden, skal vi annullere bekræftelsen, og så kan vi bruge basicReject-metoden i Channel.
Den første parameter angiver leveringstaget, og den anden parameter beskriver, hvordan denne fejlmeddelelse skal håndteres.En værdi af true betyder, at beskeden lægges tilbage i køheaderen, og en værdi af false betyder, at beskeden er forladt。
|