我有多个任务生成器,可以将工作添加到队列中.我也有多个消费者以该队列为食.由于这些队列是FIFO,因此它们按照添加的顺序出列.
在我的方案中,任务从HTTP请求添加到队列中.每个任务都与一个帐户相关联,并且没有速率限制.因此,可以让来自一个帐户的任务充斥消息队列.
为了解决这个问题,我一直在寻找一个队列实现,它允许我以循环方式处理来自多个帐户的排队任务以实现公平.
我目前使用Redis并使用一些Lua脚本来模拟循环队列,但是想知道是否有任何现有的排队拓扑可以实现这一目标?
Mat*_*ans 11
我通常这样做:
不要将任务直接放入工作队列中,而是为每个帐户创建一个单独的任务队列。每个请求都会将一个任务放入其帐户队列中,并且当帐户队列从空变为非空时,请将帐户队列放入全局工作队列中
当工人准备进行更多工作时,他们将从工作队列中获取帐户队列。当工作人员使用帐户队列时,它会执行第一个任务,并且如果该帐户队列不为空,则工作人员会立即将帐户队列放回工作队列的末尾。然后工人执行任务。
使用此系统,每个帐户队列最多只能在工作队列中一次,并且 所有具有相关工作的帐户均在工作队列中平均表示。
这很容易实现,但是您必须谨慎检测何时必须将帐户队列放入工作队列,因为可能有两个线程同时做出此决定,并且您不希望这样做。帐户队列两次进入。
我这样简单:
在每个帐户队列中都有一个原子布尔值,以跟踪它是否在工作队列中。工作人员在出队帐户队列后立即将其设置为false。如果有人发现帐户队列为非空,则可以尝试将此布尔值CAS设置为true,如果成功,则将帐户队列放入工作队列。
帐户队列为空时,很有可能进入工作队列。确保这是无害的-如果工作人员无法从帐户队列中执行任务,则应该将其忘记,并从工作队列中获取新的帐户队列。
我知道WebSphere在5.1版(非常旧)中提供了这样的队列,单个队列可以提供带有子队列的服务,即在您的情况下,您将为每个客户端创建一个子队列,然后基本上可以像这样进行循环询问处理下一个任务的每个子队列。但我不知道细节,一般不会推荐WebSphere(凭经验谈)。但我想以编程方式,您可以维护一个队列列表或队列队列,其中较低级别的每个队列代表来自特定客户端的任务队列。然后您可以使用自己的逻辑从正确的队列中按票价顺序获取任务。当然,您必须管理您的队列,即清理空队列,并在收到新任务时检查该客户端是否已有专用队列,并将您的任务相应地添加到新的或现有的队列中。