使用公平插槽策略从队列中获取下一个任务

时间:2019-04-11 22:48:49

标签: php mysql math task

在我们的服务上,用户可以添加不同的任务,只要有空位就可以执行这些任务。
所有任务都存储在mysql表中。桌子看起来像

user_id | task   | status         | created_at | started_at 
int     | string | pending,active | datetime   | datetime

我们当前正在使用fifo策略,但是由于任务数量在增加,并且我们不想增加用户可以添加的任务数量的限制,因此我们想为其添加公平的广告位策略。通常,任务在完成前需要运行30至75分钟。也可以更少或更多。

我创建了一组示例数据:

示例数据:

158 total tasks
144 pending tasks 
 14 running tasks
 15 tasks can run at the same time

 # of pending tasks for each user    
 user 1 => 28 tasks
 user 2 => 76 tasks
 user 3 =>  5 tasks 
 user 4 => 22 tasks
 user 5 =>  3 tasks

 # of active tasks for each user
 user 1 =>  5 tasks
 user 2 =>  0 tasks
 user 3 =>  2 tasks 
 user 4 =>  4 tasks
 user 5 =>  3 tasks  

我的方法是
-first:将每个用户的待处理任务数除以总待处理任务数(pending_tasks_of_user_x / pending_tasks)。
-second:然后将活动任务划分为可以同时运行的任务数量(active_tasks_of_user_x / current_tasks)。

但是现在我不知道如何进行。如果我的方法是完全错误的,那么我会接受的。

要使用php访问数据库。

编辑:

公平地说,我定义用户不必等待其他用户的所有其他任务完成。例如,用户2有76个任务,而用户1有28个任务。现在,用户5添加了3个任务。我不希望用户5必须等到必须先执行用户1和2的所有任务才能执行用户5的任务。更像是用户2可以一次运行8个任务,用户1 4和用户5可以一次运行2,或者类似。如果可用的用户多于并发任务,则它应相应地缩小,并且有些必须等待。

1 个答案:

答案 0 :(得分:0)

在这种情况下,我认为Fair-share scheduling是个好方法。

将可用任务槽的总数除以具有待处理任务的用户总数。

15/5 = 3

每个用户现在可以一次运行3个任务。

这意味着任务少的用户将很快完成,任务多的用户必须等待更长的时间。

如果出现另一个用户,则可用任务将为

15/6 = 2.5

您当然不能运行一半的任务,但是可以通过实际的排队算法解决。

我认为您可以在PHP中实现它。我认为这不是为您编写代码的地方。

算法应如下所示:

  1. 任务空余,正在寻找要执行的新任务。
  2. 查找运行任务最少的用户。
  3. 查找该用户最早的待处理任务。
  4. 如果用户没有任何待处理的任务,请从考虑中删除该用户,然后从第2点重新开始。
  5. 运行待处理任务。

这是实现此目标所需要做的。