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