RabbitMQ:一个队列中的多个消费者是否可以使用非轮询策略?

时间:2010-12-30 16:55:11

标签: message-queue messaging rabbitmq producer-consumer blackboard

我们使用RabbitMQ将作业从一台机器上的生产者发送到分布在多台机器上的一小部分消费者。

生产者生成作业并将其放在队列中,并且消费者每隔10ms检查一次队列,以查看是否有任何无人认领的作业,并在作业可用时一次获取作业。如果一个特定的工作人员花费太长时间处理作业(GC暂停或其他短暂问题),其他消费者可以自由地从队列中删除作业,以便整体作业吞吐量保持很高。

当我们最初设置这个系统时,我们无法弄清楚如何为队列中的多个消费者建立订户关系,这将阻止我们不得不轮询并引入一点额外的延迟。 / p>

检查文档并没有产生令人满意的答案。我们不熟悉使用消息队列,我们​​可能不知道准确描述上述场景的单词。这类似于blackboard system,但在这种情况下,“专家”都是相同的,并且永远不会消耗彼此的结果 - 结果总是会报告给作业生产者。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

在这里你必须记住,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个队列编写了一个代码示例,你可以添加更多像上面这样的队列........

答案 1 :(得分:0)

获得pub-subscribe是直截了当的,我的初学者有同样的问题,但效果很好。该项目现在在http://www.rabbitmq.com/getstarted.html

上有一些很棒的帮助页面

RabbitMQ有超时和一个可以根据需要使用的resernt标志。

你也可以让工作人员每隔10毫秒检查一次事件。如果你需要帮助,我在http://rabbitears.codeplex.com/有一个小项目可能会有所帮助。