我有一个应用程序,可以同时从多个用户接收三种类型的消息,并且正在使用3个队列/消费者和3个交换来处理它。我的问题是,当队列中有一个用户收到数千条消息时,其他用户正在等待。
我正在寻找一种解决方案来并行执行每个用户的作业。我可以为每个用户动态创建队列,但这不是一个好的解决方案,因为将有数百个队列和使用者。如何自动删除空闲的使用者/队列。我可以以任何方式使用芹菜和Redis吗?
答案 0 :(得分:0)
在RabbitMQ中使用许多队列不是一个好主意。队列是RabbitMQ服务器上的单线程。
您的问题是“一个用户的成千上万的msg会阻止其他用户”,我认为解决方案是使用Priority Queue。
每个用户都有一个计数器来记录在一段时间内已发送了多少条消息,如果此值较大,则用户发布的消息将具有较低的优先级。因此,如果队列中有许多消息正在等待,则来自其他用户的消息将首先发送到您的使用者作业。在这种情况下,您应该在消费者的频道上设置适当的“预取”。
答案 1 :(得分:0)
您必须添加更多队列才能进行扩展,并且要保持一致,可以使用哈希分布。
您可以将插件用作https://github.com/rabbitmq/rabbitmq-consistent-hash-exchange,也可以手动执行,如果一个节点不够用,可以扩展更多的队列,您可以扩展群集,可以创建集群(https://www.rabbitmq.com/clustering.html)并将负载分配到更多节点。
如果需要顺序,则只有一个使用者使用队列。
如果您不需要顺序性,则可以将更多使用者使用到同一队列中,这样,您可以使用更多队列,更多节点,更多使用者进行扩展