2013-06-24 3 views
2

Я использую AMQP в шаблоне надежности, и мой прецедент предназначен для размещения сообщений в очереди, а затем их использования и вставки информации в веб-службу. Мой веб-сервис работает медленно, и моя очередь может иметь много и много сообщений, и я хотел бы убедиться, что потребитель не убивает мою базу данных.Дросселирование потребителя AMQP с использованием RabbitMQ

Есть ли встроенный способ выполнения дросселирования в RabbitMQ, основанный на времени (только X сообщений в минуту/секунду/час) или какой-либо другой механизм?

+0

Только комментарий, связанный с channel.flow: это устарело от версии 3.3.0 http://www.rabbitmq.com/blog/2014/04/02/breaking-things-with-rabbitmq-3- 3/ – hveiga

ответ

2

Управление потоком per-connection, поэтому, если у вас слишком много сообщений на сервере, издатели будут ждать. RabbitMQ - очень надежная система, я могу сказать, что вы не можете беспокоиться об этом.

Если вы говорите о том, как ограничить потребление, возможно, вам придется позаботиться об этом самостоятельно. Вы также можете посмотреть на channel.flow (устаревшие на RabbitMQ 3.3.0) и basic.qos методы, или вы можете даже временно отключить потребителя (ов) и снова подключить их обратно, когда ваши услуги будут способны выполнять нагрузку.

UPD Я могу предположить, что вы потребляете сообщения с basic.consume и кормить его на свой веб-сервис. Основываясь на том, как долго вы загружаете полезную нагрузку на веб-сервисы, вы можете догадаться, что это нагрузка и сделать что-то вроде sleep(N). Пока ваш потребитель будет спать, он ничего не будет потреблять, поэтому никакой веб-сервис не будет подаваться.

+0

Я не очень беспокоюсь о резервном копировании брокера, меня больше беспокоит перегрузка моего веб-сервиса слишком большим количеством соединений, если у меня есть разъем AMQP, который вытягивает все сообщения, которые он может за один раз. – Nicholas

+0

какой язык вы используете для написания приложения? – pinepain

+0

Java. Я надеялся, что не буду писать свою собственную логику для этого, и что у RabbitMQ/AMQP может быть что-то встроенное. – Nicholas

0

Мне интересно, связано ли управление потоком через соединение с channel.flow().

В принципе, вы можете позвонить channel.flow(false);, чтобы сообщить брокерам о прекращении отправки сообщений.
Вызов channel.flow(true); снова активирует поток. Вот javadoc.