Allereerst hebben we 100 onverwerkte berichten op onze rabbitmq-server, we openen willekeurig een consumentenclient, en de volgende situatie verschijnt:
100 stukjes data, allemaal in één oogwenk overgebracht, maar we kunnen niet zoveel data tegelijk verwerken met één klant, wat moeten we dan doen?
Zoals te zien is op de afbeelding hierboven, hebben we de ontvangst van het bericht niet bevestigd! Als de producent het blijft versturen, zullen wij consumenten het blijven ontvangen!
Stel je voor: als wij enkele consument tot 60 berichten in 1 minuut kan verwerken, maar een producent 300 berichten in 1 minuut kan sturen, als,We hebben een consumentenclient die binnen 1 minuut 300 berichten tegelijk moet ontvangen, wat onze maximale belasting heeft overschreden, wat ertoe kan leiden dat serverbronnen uitgeput raken en de consumentenclient vastloopt。
RabbitMQ biedt een qoS (Quality of Service) functie, dat wil zeggen, onder de voorwaarde van niet-automatische bevestiging van berichten, als een bepaald aantal berichten (door de waarde van Qos in te stellen op basis van consume of kanaal) niet wordt bevestigd, worden nieuwe berichten niet geconsumeerd.
prefetchSize:0 prefetchCount: Vertelt RabbitMQ dat hij niet meer dan N berichten tegelijk naar een consument moet sturen, d.w.z. zodra er N berichten zijn die nog niet zijn geackt, blokkeert de consument totdat er een bericht ackt global:true/false of bovenstaande instellingen nu op kanalen worden toegepast, om het simpel te zeggen, of de bovenstaande beperkingen nu op kanaalniveau of op consumentenniveau zijn
Opmerking: Er wordt gezegd dat prefetchSize en global niet door rabbitmq worden geïmplementeerd, dus ik zal ze voorlopig niet bestuderen
prefetch_count treedt in werking wanneer no_ask=onwaar,Dat wil zeggen, in het geval van auto-antwoord zijn deze twee waardenNiet in werkingvan
Stel prefetchCount = 3 in via de BasicQos-methode. Hierdoor kan RabbitMQ tot 3 berichten per consument tegelijk verwerken. Met andere woorden, het zal geen nieuwe berichten aan de consument verspreiden totdat het de ack ontvangt. Zo stel je het in:
Zoals je in de figuur kunt zien, luisteren er twee consumenten tegelijkertijd naar Queue, maar let op dat het bericht hier alleen automatisch wordt geaccaked als het door één consument wordt geconsumeerd, en de andere consument dit bericht niet opnieuw zal ontvangen.
Officiële website-introductie: http://www.rabbitmq.com/consumer-prefetch.html
Let op dat deze methode ervoor kan zorgen dat de wachtrij vol is. Natuurlijk moet je misschien meer Consumers toevoegen of meer virtualHosts maken om je ontwerp te verfijnen.
|