Java EE的公平任务队列

时间:2010-10-25 06:30:37

标签: java algorithm java-ee

我打算提供一项服务,让人们可以将任务(特别是转码任务)提交给系统,他们应该尽快得到服务,但同时它不应该饿死别人,即它必须是公平的。如果一个人提交2000个任务,那么系统不应该一直只迎合他,而是在其他人的请求中进行循环或类似的事情...

有没有可用的解决方案?我查看了rabbitMQ和其他消息传递系统,但它们并不能完全满足我的问题。公平的任务队列是如何实现的?

2 个答案:

答案 0 :(得分:2)

我会这样实现:

在队列上有一个队列侦听器,当一个消息到达时,检查上一次收到给定用户的任务;如果时间&lt;如果时间&lt; 1秒,将它放在队列1上如果时间<1,则将10秒放在队列2上100秒放在队列3上,否则放在队列4上。然后,您将在4个队列上拥有将处理任务的侦听器。

当然,您可以更改队列数并更改时间以匹配最佳吞吐量。理想情况下,您希望您的队列始终处于忙碌状态。

答案 1 :(得分:1)

我不认为这种行为本身存在,但我可以看到它是用RabbitMQ的一些功能实现的。

http://www.rabbitmq.com/blog/2010/08/03/well-ill-let-you-go-basicreject-in-rabbitmq/

这会让你拒绝邮件并重新排队。然后,您必须编写一个实用程序,该实用程序可以根据消息的某些标识属性选择执行或重新排队消息(在本例中,报表请求者是您的应用程序自定义的)。可以想象,如果策略包含您试图限制的用户的ID,则可以完全围绕路由密钥设计策略。

您的政策可以使用

进行结构化
  • 使用basic.reject进行回复
  • 使用{requeue = true}

希望这有帮助!