По-перше, на нашому сервері rabbitmq є 100 необроблених повідомлень, ми випадково відкриваємо споживчий клієнт, і з'являється така ситуація,
100 об'єктів даних, усі миттєво, але ми не можемо обробляти стільки даних одночасно з одним клієнтом, що нам робити?
Як показано на зображенні вище, ми не підтвердили отримання повідомлення! Якщо виробник продовжить надсилати її, ми, споживачі, будемо отримувати її й надалі!
Уявіть собі, якщо ми, один споживач, можемо обробити до 60 повідомлень за 1 хвилину, однак виробник може надіслати 300 повідомлень за 1 хвилину, якщо,У нас є клієнт-споживач, який має отримати 300 повідомлень одночасно за 1 хвилину, що перевищує наше максимальне навантаження, що може призвести до вичерпання ресурсів сервера і зависання споживчого клієнта。
RabbitMQ надає функцію qoS (якість обслуговування), тобто за умови неавтоматичного підтвердження повідомлень, якщо певна кількість повідомлень (встановлюючи значення Qos на основі споживання або каналу) не підтверджується, нові повідомлення не будуть споживатися.
prefetchSize:0 prefetchCount: Повідомляє RabbitMQ не надсилати споживачеві більше ніж N повідомлень одночасно, тобто якщо є N повідомлень, які ще не ack, споживач блокуватиме, доки не з'явиться повідомлення 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
Зверніть увагу, що цей метод може призвести до заповнення черги. Звісно, можливо, доведеться додати більше споживачів або створити більше віртуальних хостів для вдосконалення дизайну.
|