【发布时间】:2019-06-19 22:52:58
【问题描述】:
我有一项可能需要长时间运行(数小时)的任务。该任务由从消息队列(在我的情况下为 AWS SQS)读取的多个工作人员(在我的情况下为 AWS ECS 实例)执行。我有多个用户将消息添加到队列中。问题是,如果 Bob 向队列中添加 5000 条消息,足以让工作人员忙 3 天,然后 Alice 出现并想要处理 5 个任务,Alice 需要等待 3 天才能开始 Alice 的任何任务。
我想在 Alice 提交任务后立即以相等的速率从 Alice 和 Bob 向工作人员提供消息。
我已经在另一个上下文中解决了这个问题,方法是为每个用户(甚至用户提交的每个批次)创建多个队列(子队列),并在消费者请求下一条消息时在所有子队列之间交替。
至少在我的世界里,这似乎是一个常见问题,我想知道是否有人知道解决它的既定方法。
我没有看到 ActiveMQ 的任何解决方案。我看过 Kafka,它能够在一个主题中循环分区,这可能会奏效。现在,我正在使用 Redis 实现一些东西。
【问题讨论】:
-
你没有了解queueing theory
-
@GuyCoder 如果您能指出适用于此处的排队理论的某些方面,那将很有帮助。然而,即使我的问题涉及队列,我认为排队理论不会有帮助,因为我知道我想要的行为。我只是想找到一种实现行为的最佳方式。
-
有 5003 条消息,但只有两个参与者。以循环方式为参与者提供服务,一次一条消息(或一批消息,以加快速度;您决定批量大小)。这就是你实际写的内容,这是一个很好的方法。
-
感谢@dialecticus 的分析。我已经使用 Redis 提交了一个有效的实现。需要更多测试以了解它如何与许多并发用户、错误条件等一起扩展,但对于第一次尝试它很有好处。我将演员队列汇集到一个单独的就绪队列中,我将其保持在不超过活动演员队列数量的大小。漏斗逻辑使用最近服务最多的参与者队列的运行状态。