将相同的队列项分配给多个工作人员

Posted

技术标签:

【中文标题】将相同的队列项分配给多个工作人员【英文标题】:Assign same queue item to multiple workers 【发布时间】:2021-04-17 23:01:28 【问题描述】:

我们有一个逻辑任务队列,其中每个任务都必须分配给多个工作人员。 要分配的工人数量基于最小和最大工人的配置。 工人不应该看到他们已经完成的相同任务。没有必要让所有工作人员都看到所有任务。

工人总数可以动态变化。每个工作人员都可以随时在线或离线。

每个工作人员都可以选择完成任务或让它过期。 到期时,应将任务分配给尚未完成任务的任何工人。

有解决这种情况的好算法吗?

【问题讨论】:

【参考方案1】:

简单的解决方案:

贪婪分配任务:

对于每一个准备好的任务。 找到最小 重复直到您运行 工人或完成所有任务。 如果工作人员上线或完成任务,请重新检查所有任务。 如果有新任务到来,请重新检查可用的工作人员。

如果没有那么多任务,这个解决方案可能就足够了,因为它的计算量很大并且会重新计算所有内容。

可能的优化:

如果贪心解决方案失败(而且很可能会失败),有办法改进它。我会尝试列出我想到的那些,但它不会是一个详尽的列表。

首先,我个人最喜欢:网络流。不幸的是,我没有看到解决最少工人要求的简单方法,但是它会很快,并且会导致在任何给定时刻分配尽可能多的工人。

创建网络 Source - Workers - Tasks - Sink。 Edges 工作人员与任务将根据需要链接和取消链接: 当工作人员可用于任务时,创建权重为 1 的边,否则不创建边。 从源链接到每个在线工作者的权重为 1 的边。 从每个任务链接中,一条边的权重等于其最大工作人员容量。

您甚至可以区分不同类型的工作人员,网络流非常棒。算法速度很快,这使得它们甚至适用于大图。此外,它们在许多库中都可用,因此您不必自己实现它们。不幸的是,没有简单的方法来执行最少工人规则。至少我现在没有看到,可能有某种方式。或者至少是启发式的

第二,聪明而贪婪

为每个任务创建一个队列。 当工作人员可用时,将他可以执行的每项任务注册到其队列中。 当某个工作人员不可用时,将他从队列中移除。 当任务有足够的工作人员时,启动进度并禁用这些工作人员。

这仍然是蛮力方法,但是由于您保留队列,因此您将必要的计算量限制在合理的水平。潜在的缺点是大型任务(具有最少数量的工人)可能会被更容易开始的小任务所拖延 - 并且会吃掉工人。因此,可能需要进一步检查/平衡和确定优先级。

对于您手头的任务肯定有更多的尝试和完成,但是您提供的信息相当有限,所以这个建议不是那么具体。

【讨论】:

以上是关于将相同的队列项分配给多个工作人员的主要内容,如果未能解决你的问题,请参考以下文章

TFS2010:设置一个警报,当工作项分配给团队成员时,该警报将通过电子邮件发送给他们

谷歌数据流流式传输管道在窗口化后不会将工作负载分配给多个工作人员

RabbitMQ指南之二:工作队列(Work Queues)

1723. 完成所有工作的最短时间

RabbitMQ入门工作队列

转载: 任务分配问题---匈牙利算法