消费者分配RabbitMQ

时间:2014-04-28 14:32:47

标签: rabbitmq distribution consumer

需要帮助设计rabbit-mq消费者分发。

例如, 有100个队列和10个线程来消耗来自该100个队列的消息。 每个线程将消耗每个10队列的消息。 问题1:如何动态地将线程分配给队列?如果线程在不同的机器上运行?

从队列中消耗的线程不应超过一个(以维护在相应队列中处理消息的顺序) 问题2:当系统运行时需要增加消费者线程时,如何完成?。

1 个答案:

答案 0 :(得分:0)

关于消息订单(FIFO)有很多帖子,你有正常情况(一个生​​产者一个没有网络问题的消费者)你没有任何问题。但是你可以阅读here

  

特别注意"除非重新传送的字段已设置"条件,   这意味着消费者的任何脱节都可能导致消息未决   确认随后无序发送。

此外,例如,如果您发布消息并且在发布期间出现了一些错误,则必须按正确的顺序重新发布消息。 这意味着如果您完全需要消息顺序,则必须实现它,例如使用序列号标记每个数据包,并且还应实现确认发布。

我认为,但我认为,当您使用消息系统时,您不必担心消息顺序,因为应该是您的应用程序能够管理数据。

话虽如此,如果我们假设100个队列必须处理相同的消息类型,您可以使用ThreadPoolExecutor并从所有消费者共享它。 例如:

public class ActualConsumer extends DefaultConsumer { 
public ActualConsumer(Channel channel) { 
super(channel); 
} 
@Override 
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body) throws java.io.IOException { 
MyMessage message = new MyMessage(body); 
    mythreadPoolExecutorShared.submit(new MyHandleMessage(message))
} 

}

通过这种方式,您可以平衡线程之间的消息。 同样对于threadPool,您可以使用不同的策略,例如具有固定线程号的静态分配或动态线程分配 请阅读这篇关于threadpool resize(Can you dynamically resize a java.util.concurrent.ThreadPoolExecutor while it still has tasks waiting)的帖子 您可以将此模式应用于所有节点,这样您就可以平衡调度消息并分配正确的线程数。

我希望它有用,我希望更详细,但你的问题有点通用。