需要帮助设计rabbit-mq消费者分发。
例如, 有100个队列和10个线程来消耗来自该100个队列的消息。 每个线程将消耗每个10队列的消息。 问题1:如何动态地将线程分配给队列?如果线程在不同的机器上运行?
从队列中消耗的线程不应超过一个(以维护在相应队列中处理消息的顺序) 问题2:当系统运行时需要增加消费者线程时,如何完成?。
答案 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)的帖子 您可以将此模式应用于所有节点,这样您就可以平衡调度消息并分配正确的线程数。
我希望它有用,我希望更详细,但你的问题有点通用。