RabbitMQ: Возможно ли использование нескольких потребителей в одной очереди без опроса? - PullRequest
0 голосов
/ 30 декабря 2010

мы используем RabbitMQ для отправки заданий от производителя на одну машину небольшой группе потребителей, распределенной по нескольким машинам.

Производитель создает задания и помещает их в очередь, а потребители проверяют очередь каждые 10 мс, чтобы узнать, есть ли какие-либо невостребованные задания, и извлекать задание за раз, если задание доступно.Если одному конкретному работнику требуется слишком много времени для обработки задания (GC-паузы или другие временные проблемы), другие потребители могут свободно удалять задания из очереди, чтобы общая пропускная способность работ оставалась высокой.

Когда мы изначально настроили этоВ системе нам не удалось выяснить, как настроить отношения подписчика для более чем одного потребителя в очереди, что помешало бы нам опрашивать и вводить этот небольшой дополнительный задержка.

Проверка документациине дали удовлетворительных ответов.Мы новички в использовании очередей сообщений, и, возможно, мы не знаем слов, которые точно описывают вышеописанный сценарий.Это что-то вроде системы досок , но в этом случае «специалисты» все идентичны и никогда не используют результаты друг друга - результаты всегда сообщаются производителю задания.

Любойидеи?

Ответы [ 2 ]

0 голосов
/ 16 января 2011

Получение подписки на паб очень просто, у меня начались те же проблемы, но она работает хорошо. У проекта теперь есть несколько отличных справочных страниц на http://www.rabbitmq.com/getstarted.html

RabbitMQ имеет тайм-аут и флаг резервирования, который можно использовать по своему усмотрению.

Вы также можете заставить работников руководствоваться событиями в зависимости от проверки каждые 10 мс и т. Д. Если вам нужна помощь в этом, у меня есть небольшой проект на http://rabbitears.codeplex.com/, который может немного помочь.

0 голосов
/ 31 декабря 2010

Здесь следует помнить, что канал rabbitMQ не является поточно-ориентированным.поэтому создайте одноэлементный класс, который будет обрабатывать все эти операции rabbitmq

как

Я пишу пример кода в SCALA

    Object QueueManager{

      val FACTORY = new ConnectionFactory
      FACTORY setUsername (RABBITMQ_USERNAME)
      FACTORY setPassword (RABBITMQ_PASSWORD)
      FACTORY setVirtualHost (RABBITMQ_VIRTUALHOST)
      FACTORY setPort (RABBITMQ_PORT)
      FACTORY setHost (RABBITMQ_HOST)

    conn = FACTORY.newConnection
      var channel: com.rabbitmq.client.Channel =  conn.createChannel

    //here to decare consumer  for queue1
    channel.exchangeDeclare(EXCHANGE_NAME, "direct", durable)
      channel.queueDeclare(QUEUE1, durable, false, false, null)
      channel queueBind (QUEUE1, EXCHANGE_NAME, QUEUE1_ROUTING_KEY)
      val queue1Consumer = new QueueingConsumer(channel)
      channel basicConsume (QUEUE1, false, queue1Consumer)

    //here to decare consumer  for queue2
    channel.exchangeDeclare(EXCHANGE_NAME, "direct", durable)
      channel.queueDeclare(QUEUE2, durable, false, false, null)
      channel queueBind (QUEUE2, EXCHANGE_NAME, QUEUE2_ROUTING_KEY)
      val queue2Consumer = new QueueingConsumer(channel)
      channel basicConsume (QUEUE2, false, queue2Consumer)





    //here u should mantion distinct ROUTING key for each queue
       def addToQueueOne{
    channel.basicPublish(EXCHANGE_NAME, QUEUE1_ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN, obj.getBytes)
    }

   def addToQueueTwo{
channel.basicPublish(EXCHANGE_NAME, QUEUE2_ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN, obj.getBytes)
}

def getFromQueue1:Delivery={
 queue1Consumer.nextDelivery
}

def getFromQueue2:Delivery={
  queue2Consumer.nextDelivery
}

}

у меня естьНаписал пример кода для 2 очередей, вы можете добавить больше очередей, как указано выше ........

...