我工作的是一个基于多租户云应用程序的Web应用程序(许多客户端,每个客户端都有自己独立的“环境”,但全部位于共享硬件集上)和我们正在引入用户批量处理以供日后处理的功能。批量工作的类型实际上并不重要,只有足够的数量才能在没有工作队列的情况下完成工作并不实际。我们选择RabbitMQ作为我们的底层队列框架。工作者池和多租户队列与RabbitMQ
因为我们是一个多租户应用程序,所以我们不一定希望客户端能够为另一个客户端导致冗长的队列处理时间,所以我们已经浮起来的一个想法是创建一个队列客户基础,并拥有一个共享的工作人员池指向我们所有的客户端队列。问题在于,为了我能想象的最好,工作人员直接与特定的队列绑定,而不是交换。在我们的理想世界中,我们的客户端队列仍然会被处理,而没有一个客户端阻塞另一个客户端,而是从共享的工作池中处理,我们可以通过启动更多工作人员或关闭闲置服务器来增加或减少。将工作人员与特定队列绑定在一起可以防止我们从实际意义上解决这个问题,因为我们经常有很多工作人员只是在没有活动的队列中闲置。
有没有比较直接的做法呢?我对RabbitMQ相当陌生,并没有真正能够完成我们所追求的。我们也不想写一个非常复杂的多线程的消费者应用程序,这是开发和测试时间的沉没,我们可能无法承受。我们的堆栈是基于Windows/.Net/C#的,如果这是germaine,但我不认为这应该对问题有重大影响。
我不是在问分配多个工作人员到同一个队列,我有点反问。我想要一个有限的工作池从一个大的队列中消耗(我们称之为500个队列)。 – bakasan
我已经尝试过使用这种方法的第一手资料,它并不漂亮:很难找到合适的启发式来处理所有这些队列。你是否首先处理最完整的队列?还是那些旧信息?在这两种情况下,您都没有使用AMQP协议,必须开始处理Rabbit管理API。然后你认为:让我们拥有与工作人员相同数量的队列,并在500 Q和工作队列之间添加一致的哈希映射。然后你意识到,只需一个队列和n个工人就可以参与竞争。 –
我有类似的要求,但我想确保来自特定客户的消息按顺序处理。联系人在创建之前不会被删除等。是否有一些RabbitMQ的配置或设置可以实现这一点,但共享工作人员之间的队列? (这是一个新的Q ...?) – Aaron