Først og fremst har vi 100 ubehandlede meldinger på rabbitmq-serveren vår, vi åpner en forbrukerklient tilfeldig, og følgende situasjon vil oppstå:
100 databiter, alle sendt over på et øyeblikk, men vi kan ikke behandle så mye data samtidig med én enkelt klient, hva bør vi gjøre?
Som vist på bildet over, bekreftet vi ikke mottakelsen av meldingen! Hvis produsenten fortsetter å sende det, vil vi forbrukere fortsette å motta det!
Tenk deg, hvis vi enkeltbrukere kan behandle opptil 60 meldinger på 1 minutt, men en produsent kan sende 300 meldinger på 1 minutt, hvis,Vi har en forbrukerklient som må motta 300 meldinger samtidig på ett minutt, noe som har overskredet vår maksimale belastning, noe som kan føre til at serverressursene blir brukt opp og forbrukerklienten setter seg fast。
RabbitMQ tilbyr en qoS (Quality of Service)-funksjon, det vil si, under forutsetning av ikke-automatisk bekreftelse av meldinger, hvis et visst antall meldinger (ved å sette verdien av Qos basert på konsum eller kanal) ikke bekreftes, vil ikke nye meldinger bli konsumert.
prefetchSize:0 prefetchCount: Forteller RabbitMQ at de ikke skal sende mer enn N meldinger til en forbruker samtidig, det vil si at når det er N meldinger som ennå ikke har akket, vil forbrukeren blokkere til det er en meldings-ack global:true\false Enten de ovennevnte innstillingene gjelder for kanaler, for å si det enkelt, om de ovennevnte begrensningene gjelder på kanalnivå eller forbrukernivå
Merk: Det sies at prefetchSize og global ikke implementeres av rabbitmq, så jeg vil ikke studere dem foreløpig
prefetch_count trer i kraft når no_ask=falsk,Det vil si, i tilfelle auto-svar, er disse to verdieneIkke i kraftav
Sett prefetchCount = 3 via BasicQos-metoden. Dette gjør det mulig for RabbitMQ å behandle opptil 3 meldinger per forbruker samtidig. Med andre ord vil den ikke distribuere nye meldinger til forbrukeren før den mottar ACK. Slik setter du det opp:
Som du kan se på figuren, er det to forbrukere som lytter til Kø samtidig, men merk at meldingen her bare automatisk vil bli akseptert hvis den konsumeres av én forbruker, og den andre brukeren vil ikke få denne meldingen igjen.
Offisiell nettsideintroduksjon: http://www.rabbitmq.com/consumer-prefetch.html
Merk at denne metoden kan føre til at køen blir full. Selvfølgelig kan det hende du må legge til flere Consumers eller lage flere virtualHosts for å forbedre designet ditt.
|