Първо, имаме 100 необработени съобщения на нашия rabbitmq сървър, отваряме потребителски клиент на случаен принцип и се появява следната ситуация,
100 парчета данни, всички предадени за миг, но не можем да обработваме толкова много данни едновременно с един клиент, какво да правим?
Както е показано на горната снимка, не потвърдихме получаването на съобщението! Ако производителят продължи да го изпраща, ние, потребителите, ще продължим да го получаваме!
Представете си, ако ние, един потребител, можем да обработим до 60 съобщения за 1 минута, но производител може да изпрати 300 съобщения за 1 минута, ако,Имаме потребителски клиент, който трябва да получи 300 съобщения едновременно за 1 минута, което е надвишило максималното ни натоварване, което може да доведе до изчерпване на сървърните ресурси и блокиране на потребителския клиент。
RabbitMQ предоставя функция за качество на услугата (qoS), тоест при предпоставката за неавтоматично потвърждение на съобщения, ако определен брой съобщения (чрез задаване на стойността на Qos според потребление или канал) не бъдат потвърдени, нови съобщения няма да бъдат консумирани.
prefetchSize:0 prefetchCount: Казва на RabbitMQ да не изпраща повече от N съобщения към потребителя едновременно, т.е. когато има N съобщения, които все още не са се активирали, потребителят ще блокира, докато не се появи съобщение ack global:true\false Дали горните настройки се прилагат към каналите, просто казано, дали горните ограничения са на ниво канал или на потребителско ниво
Забележка: Казва се, че prefetchSize и global не се реализират от rabbitmq, затова няма да ги изучавам засега
prefetch_count влиза в сила, когато no_ask=false,Тоест, в случая на автоматично отговаряне, тези две стойности саНе е на практикана
Задайте prefetchCount = 3 чрез метода BasicQos. Това позволява на RabbitMQ да обработва до 3 съобщения на потребител едновременно. С други думи, няма да разпространява нови съобщения на потребителя, докато не получи ack. Ето как да го настроите:
Както се вижда на фигурата, има двама потребители, които слушат Queue едновременно, но имайте предвид, че съобщението тук ще бъде автоматично активирано само ако бъде консумирано от един потребител, а другият потребител няма да получи това съобщение отново.
Официално въведение на уебсайта: http://www.rabbitmq.com/consumer-prefetch.html
Имайте предвид, че този метод може да доведе до пълна опашка. Разбира се, може да се наложи да добавите повече потребители или да създадете повече virtualHosts, за да усъвършенствате дизайна си.
|