【问题标题】:How to prioritise a busy queue so low priority items get processed too?如何对繁忙的队列进行优先级排序,以便处理低优先级的项目?
【发布时间】:2013-08-17 14:05:02
【问题描述】:

我们使用 mysql 表实现了一个基本的作业队列,其中一些项目的优先级低于其他项目。由于队列不断被高优先级的项目填满,因此低优先级的项目有时永远不会被处理。

在我们的实现中,我们将项目及其优先级插入到表中,并从队列中获取下一个项目,我们像这样查询表:

SELECT * FROM `queue` ORDER BY `priority` DESC, `created_at` ASC

我们应该如何对队列进行建模,以便仍能及时处理较低优先级的项目?

编辑

队列通常包含超过 25,000 个项目。

【问题讨论】:

    标签: mysql algorithm sorting queue scheduling


    【解决方案1】:

    也许您可以按队列中的时间来衡量优先级。这样,任务未完成的时间越长,优先级越高,最终这些任务应该移到列表的顶部。

    您似乎已经拥有有关何时记录任务的数据(“created_at”),所以我认为您拥有所需的一切:

    SELECT * FROM queue ORDER BY priority*( now() - created_at ) DESC
    

    【讨论】:

    • 这很有趣。我要试试。感谢您的回答。
    • priority + (now() - created_at)(这显然会给出完全不同的答案),或者实际上两者中的任何一个函数都会随着两者的增加而增加。人们必须四处寻找所需的行为(或从数学上确定函数)。
    【解决方案2】:

    执行此操作的经典方法是在选择一个后立即增加队列中每个项目的优先级。这样,较旧的低优先级项目将在某一时刻累积足够的优先级以超过任何新的高优先级项目。

    有点像循环

    SELECT * FROM `queue` ORDER BY `priority` DESC, `created_at` ASC LIMIT 1;
    -- read selected queue item
    DELETE FROM `queue`WHERE <primary key>=<primary key of selected element>;
    UPDATE `queue` SET `priority`=`priority`+1;
    

    应该够用了

    【讨论】:

      【解决方案3】:

      已经发布了两个答案,一个使用动态计算的时间差,另一个涉及整个数据库的更新。不需要其中任何一个的第三个选项是在插入新项目时自行调整优先级值。例如,当插入优先级为 P 的项目时,将“priority”列设置为 P,并将另一列“priority_adjusted”设置为 P - X,其中 X 是一个整数,每秒钟或每分钟增加一。然后查询

      SELECT * FROM `queue` ORDER BY `priority_adjusted` DESC;
      

      按处理顺序返回项目,“优先级”列包含原始优先级。这应该很快,因为它不需要动态计算任何东西,也不需要数据库更新。

      处理数据库的系统必须这样做:

      every <time interval>:
         X = X + 1
      

      当插入集合 priority_adjustedpriority 减去 X。

      如果您的优先级值介于 1..100 之间,那么在 100 个间隔(X 增加 100 倍)之后,从时间 0 开始的所有最低优先级项目将在时间 100 插入的任何项目之前处理。

      【讨论】:

        【解决方案4】:

        有时在线程调度中使用的另一种解决方案是为每个优先级添加一个虚拟项目。

        在每个优先级,项目都按照到达的顺序进行选择。当前优先级的虚拟项目,当被选中时,将触发从较低优先级的项目的选择,并重新插入到队列的后面。

        这确保了较低优先级的项目既不会被忽略,也不会比优先级较高的项目更快地被拾取。

        【讨论】:

        • 我喜欢你的想法,但我不确定它是否可以使用简单的 SQL 轻松实现?
        猜你喜欢
        • 2012-02-24
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-20
        • 2016-09-23
        • 1970-01-01
        相关资源
        最近更新 更多