用于多交换队列模型的RabbitMQ消费者设计

时间:2016-01-20 08:53:35

标签: rabbitmq message-queue rabbitmq-exchange

我有一个RabbitMQ设置,配置如下。

  • 每个Exchange都是FANOUT类型
  • 多个队列附加到每个Exchange。
  • BlockingConnection由消费者制作。
  • 单个消费者处理所有回调。

问题 -

某些有效负载比其他有效负载需要更长的处理时间,这导致消费者即使在其他队列中存在有效负载时也会保持空闲状态。

问题 -

  1. 我应该如何实施消费者以避免长时间等待?我是不是该 为每个模块运行单独的消费者?任何用户体验?
  2. 我可以配置RabbitMQ来处理这些情况吗?如果是这样的话。?

2 个答案:

答案 0 :(得分:0)

首先,知道为什么你有多个扇出交换会很好吗?你真的需要这个吗?扇出交换将消息发送到所有队列......

  1. 只是有更多的消费者。检查this example from rabbitmq tutorial
  2. 你真的不需要明确配置rabbitmq,一切都可以通过客户端(发布者和订阅者)来完成,你只需要弄清楚你需要多少个交换机以及它们应该是哪种类型等等。 / LI>

答案 1 :(得分:0)

首先,您使用的编程语言是什么?大多数常见语言,如python,java,c#,都支持为并行进程创建额外的线程。

假设您使用下面的队列(pseu代码):

def callback(ch, method, properties, body) ...
def threaded_function(ch, method, properties, body) ...

channel.basic_qos(prefetch_count=3)
channel.basic_consume(callback, queue='task_queue')
channel.start_consuming()

首先,设置“prefetch_count = 3”允许您的消费者同时拥有处于非-ack状态的最多3条消息。

在回调方法中,您应该使用threaded_function启动一个执行每条消息的线程。在threaded_function方法体的末尾,执行:

ch.basic_ack(delivery_tag = method.delivery_tag)

这样,最多可以同时处理3条消息,即使一个或两个线程运行需要更长的时间,其他线程仍然可以处理下一条消息。