För det första har vi 100 obehandlade meddelanden på vår rabbitmq-server, vi öppnar en konsumentklient slumpmässigt, och följande situation kommer att uppstå,
100 datastycken, alla skickade över på ett ögonblick, men vi kan inte bearbeta så mycket data samtidigt med en enda klient, vad ska vi göra?
Som visas på bilden ovan bekräftade vi inte mottagandet av meddelandet! Om producenten fortsätter att skicka det, kommer vi konsumenter att fortsätta få det!
Föreställ dig bara, om vi enskilda konsumenter kan bearbeta upp till 60 meddelanden på 1 minut, men en producent kan skicka 300 meddelanden på 1 minut, om,Vi har en konsumentklient som måste ta emot 300 meddelanden samtidigt på 1 minut, vilket har överskridit vår maximala belastning, vilket kan leda till att serverresurserna tar slut och konsumentklienten fastnar。
RabbitMQ tillhandahåller en qoS (Quality of Service)-funktion, det vill säga, under förutsättningen att meddelanden inte bekräftas automatiskt, om ett visst antal meddelanden (genom att sätta värdet på Qos baserat på konsum eller kanal) inte bekräftas, kommer inga nya meddelanden att konsumeras.
prefetchSize:0 prefetchCount: Säger åt RabbitMQ att inte skicka mer än N meddelanden till en konsument samtidigt, dvs. när det finns N meddelanden som ännu inte har ackat, kommer konsumenten att blockera tills det finns ett meddelande-ack global:true/false Oavsett om ovanstående inställningar gäller kanaler, för att uttrycka det enkelt, oavsett om ovanstående begränsningar gäller på kanalnivå eller konsumentnivå
Notera: Det sägs att prefetchSize och global inte implementeras av rabbitmq, så jag kommer inte att studera dem för tillfället
prefetch_count träder i kraft när no_ask=falskt,Det vill säga, i fallet med auto-svar är dessa två värdenInte i praktikenav
Sätt prefetchCount = 3 via BasicQos-metoden. Detta gör att RabbitMQ kan behandla upp till 3 meddelanden per konsument samtidigt. Med andra ord kommer den inte att distribuera nya meddelanden till konsumenten förrän den får ACK. Så här ställer du in det:
Som du kan se i figuren lyssnar två konsumenter på Queue samtidigt, men observera att meddelandet här bara automatiskt ackes om det konsumeras av en konsument, och den andra konsumenten får inte meddelandet igen.
Officiell webbplats introduktion: http://www.rabbitmq.com/consumer-prefetch.html
Observera att denna metod kan göra kön full. Självklart kan du behöva lägga till fler Consumers eller skapa fler virtualHosts för att förfina din design.
|