Как ограничить пропускную способность с помощью RabbitMQ?

Откуда вопрос:

Мы используем RabbitMQ в качестве очереди задач. Одна из конкретных задач - рассылка уведомлений в социальную сеть Вконтакте. У API есть ограничение на количество запросов в секунду, и это ограничение зависит от размера вашего приложения. Всего 3 вызова для приложения с менее чем 100 тысячами человек и так далее. Поэтому нам нужно искусственно ограничивать запросы к их обслуживанию. Теперь эта логика основана на приложении. Это просто, пока вы можете использовать только одного воркера на такую ​​очередь, просто установите что-то вроде сна (300 мс) и будьте спокойны. Но когда вы должны использовать N воркеров, эта синхронизация становится нетривиальной.

Как ограничить пропускную способность с помощью RabbitMQ?

На основе рассказа выше. Если бы было возможно установить размер предварительной выборки не только на основе сообщения, но и на основе времени, эта логика могла бы быть намного проще. Например, "QOS для 1 сообщения за получение не быстрее, чем 1 раз в секундах" или так далее.

  1. Есть ли что-то подобное?
  2. Может быть другая стратегия по этому поводу?

person misterion    schedule 27.08.2014    source источник
comment
Используете ли вы N потребителей в одной очереди? Вам нужно запланировать еще одну очередь?   -  person Gabriele Santomaggio    schedule 27.08.2014
comment
Да, N потребителей в одной очереди. Это должно быть запланировано для каждой очереди.   -  person misterion    schedule 27.08.2014


Ответы (1)


Это невозможно из коробки с RabbitMQ.

Вы правы, с распределенными потребителями это регулирование становится трудным упражнением. Я бы посоветовал взглянуть на ZooKeeper, который позволит вам синхронизировать всех потребителей и регулировать обработку сообщений, используя его Znodes / Watches для регулируемого, но масштабируемого решения.

person Marcin Waligora    schedule 27.08.2014