Når forbrukeren mottar meldingen og behandlingsoppgaven er fullført, sender den en ack med denne meldingsidentifikatoren for å fortelle serveren at meldingen er mottatt og at behandlingen er fullført. RabbitMQ venter til lenken til forbrukeren som behandler en melding er tapt før den fastslår at meldingen ikke ble behandlet korrekt, så RabbitMQ sender meldingen på nytt. Meldingsbekreftelse er slått av som standard. Det finnes en noAck-parameter når man initialiserer Consumer,Hvis den settes til true, vil forbrukeren returnere en ack så snart meldingen mottas。
Generelt sett er det ofte brukte scenarioet noack satt til sant, men for prosjekter med høye risikokrav, som betaling. For hver melding må vi sikre dens integritet og korrekthet. Etter å ha mottatt meldingen, må du bekrefte at riktig forretningslogikk er utført, og deretter aktivt returnere en ack til serveren. Du kan se meldingene i køen via rabbitmqctl list_queues navn message_rady message_unacknowleded kommando, eller via bakgrunnshåndteringsgrensesnittet.
Hvis noAck settes til false, må klienten aktivt sende en ack til serveren, og hvis klienten ikke bekrefter meldingen, vil følgende situasjon oppstå:
Så lenge programmet fortsatt kjører, forblir disse 10 meldingene uferdige og kan ikke leveres på nytt av RabbitMQ. Det som er enda kraftigere, er atRabbitMQ-meldingsforbruk har ikke en timeout-mekanisme, det vil si, hvis programmet ikke startes på nytt, vil meldingen alltid være i Unacked-tilstanden. Ikke glem disse uferdige tilstandsmeldingene når du jobber med operasjonsarrangementer.
Klar
Meldinger med denne statusen finnes i køen som skal behandles.
Uanerkjent
En melding i denne statusen indikerer at den allerede er under behandling, men ikke bekreftet.
Når programmet er lukket (så lenge forbrukeren er lukket), vil disse 10 meldingene returnere til Ready-tilstanden.
Bekreftelsesmelding
Hva om klienten sender en ack til serveren? Altså, bekrefte mottakelsen av meldingen? Koden er som følger:
Når den andre parameteren i BasicAck-metoden, multiple, settes til falsk, betyr det at RabbitMQ blir varslet om at den nåværende meldingen er bekreftet.Hvis det er sant, vil en ekstra melding mindre enn leveringstaggen spesifisert av den første parameteren bli bekreftet。 (Massebekreftelse gjelder for hele kanalen)
Avbryt bekreftelsen
Hva om en av klientene i det distribuerte programmet har et unntak og ønsker å avbryte bekreftelsen av meldingen og la andre klienter behandle meldingen?
Når det er et unntak i forbruksmeldingen, må vi avbryte bekreftelsen, og deretter kan vi bruke basicReject-metoden i Channel.
Den første parameteren spesifiserer leveringstaggen, og den andre parameteren beskriver hvordan denne feilmeldingen skal håndteres.En verdi true betyr at meldingen legges tilbake i køhodet, og en verdi false betyr at meldingen forlates。
|