gpt4 book ai didi

java - 实现循环队列的一些排队机制是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:51:55 28 4
gpt4 key购买 nike

我有多个任务生产者将工作添加到队列中。我还有多个以该队列为食的消费者。由于这些队列是 FIFO,因此它们按照添加的顺序出队。

在我的场景中,任务从 HTTP 请求添加到队列中。每个任务都与一个帐户相关联,并且没有速率限制。因此,来自一个帐户的任务可能会淹没消息队列。

为了解决这个问题,我一直在寻找一个队列实现,它允许我以循环方式处理来自多个帐户的排队任务以确保公平。

我目前使用 Redis 和一些 Lua 脚本来模拟循环队列,但我想知道是否有任何现有的队列拓扑可以实现这一点?

最佳答案

我通常这样做:

  • 与其将任务直接放入工作队列,不如为每个帐户创建一个单独的任务队列。每个请求将一个任务放入自己的账户队列中,当账户队列由空变为非空时,将账户队列放入全局工作队列

  • 当工作人员准备好进行更多工作时,他们会从工作队列中提取帐户队列。当一个 worker 取出一个帐户队列时,它会取出第一个任务,如果它不为空,worker 会立即将帐户队列放回工作队列的末尾。然后 worker 执行任务。

使用此系统,每个帐户队列最多在工作队列中出现一次,并且所有具有关联工作的帐户在工作队列中均等表示

这很容易实现,但是您必须小心检测何时必须将帐户队列放入工作队列,因为可能有两个线程同时做出此决定,而您不需要不希望帐户队列进入两次。

我把它简化成这样:

  • 在每个帐户队列中都有一个原子 boolean 值,用于跟踪它是否在工作队列中。工作人员在帐户队列出队后立即将其设置为 false。如果有人发现帐户队列非空,他们可以尝试将此 boolean 值 CAS 为真,如果成功则将帐户队列放入工作队列。

  • 帐户队列在空时进入工作队列的可能性很小。确保这是无害的——如果工作人员未能从帐户队列中获取任务,它应该忘记它并从工作队列中获取一个新的帐户队列。

关于java - 实现循环队列的一些排队机制是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39914148/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com