消费者分配RabbitMQ

消费者分配RabbitMQ,rabbitmq,distribution,consumer,Rabbitmq,Distribution,Consumer,在设计rabbit mq使用者分发时需要帮助 例如, 有100个队列和10个线程来使用这100个队列中的消息。 每个线程将使用来自10个队列的消息。 问题1:如何将线程动态分配给队列?。如果线程在不同的机器上运行 从一个队列中消耗的线程不应超过一个(以保持在相应队列中处理消息的顺序) 问题2:当系统运行时需要增加用户线程时,如何做到这一点?有很多关于消息顺序(FIFO)的帖子,在正常情况下(一个生产者一个消费者没有网络问题),您没有任何问题。但正如你所看到的 特别注意“除非重新交付字段已设置”条

在设计rabbit mq使用者分发时需要帮助

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

从一个队列中消耗的线程不应超过一个(以保持在相应队列中处理消息的顺序)
问题2:当系统运行时需要增加用户线程时,如何做到这一点?

有很多关于消息顺序(FIFO)的帖子,在正常情况下(一个生产者一个消费者没有网络问题),您没有任何问题。但正如你所看到的

特别注意“除非重新交付字段已设置”条件, 这意味着消费者的任何断开连接都可能导致消息挂起 随后按顺序交付的确认函

此外,例如,如果您发布了一条消息,但在发布过程中出现了一些错误,则必须按照正确的顺序重新发布该消息。 这意味着,如果您绝对需要消息顺序,您必须实现它,例如,用序列号标记每个数据包,并且您还应该实现确认发布

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

话虽如此,如果我们假设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))
} 
}

通过这种方式,您可以在线程之间平衡消息。 对于线程池,您还可以使用不同的策略,例如固定线程数的静态分配或动态线程分配。
请阅读这篇关于线程池大小调整()的文章 您可以将此模式应用于所有节点,这样就可以平衡调度消息并分配正确的线程数


我希望它能有用,我想更详细一些,但你的问题有点笼统

您可以使用ExecutorService()将线程分配给使用者。“如果线程在不同的机器上运行”的含义是什么?我认为您可以通过使用所有使用者共享的ThreadPoolExecutor并动态调整其大小来解决这个问题。问题是一般性的,有很多方法可以实现你想要的。只是一个OT,我已经回答了你的一个问题()谢谢你的反馈。你能分享一个例子吗。如果我们委托给ExecutorService,如何确保处理消息的顺序?。“如果线程在不同的机器上运行”-例如,在这10个线程中,5个来自NodeA,5个来自NodeB