异构任务集的动态优先级

maa*_*nus 5 java scheduler job-scheduling

我有一堆重复的任务要安排.他们查询数据库以找出要执行的操作,然后执行某些操作,如统计信息更新,发送电子邮件,获取文件和导入文件.目前,可能有十个,这个数字预计会增长很多.我没有给出任何时间限制,实际上,选择算法是我的工作,以便没有人抱怨.:d

目前,我正在使用线程的临时组合和周期性安排的任务

  • 对于最重要的任务,有一个自己的线程在空闲时回落到一个短暂的睡眠状态(当新的重要工作到来时,它可以被唤醒).
  • 另一项重要任务是在自己的线程中每小时安排一次
  • 中等重要性任务被定期安排"填补空洞",因此可能只有其中一个任务在任何时刻运行
  • 最不重要的任务都由一个专用线程处理

它目前似乎运作良好,但它不是面向未来的,并且由于以下原因而感觉不对:

  • 由于最不重要任务的队列可能会增长很多,因此这些任务可能会无限期地延迟.
  • 填充孔可能会出错,并且可能会同时运行许多任务.
  • 在任何给定时刻运行的任务数量应取决于服务器负载.(*)

(*)它主要是一个Web服务器,服务请求实际上是最高优先级.获得单独的服务器无济于事,因为瓶颈通常是数据库.目前,它工作正常,但我正在寻找一个更好的解决方案,因为我们希望负载在一两年内增长100倍.

我的想法是提高工作的优先级,当它被推迟太多时.例如,有统计数据每小时运行一次并将它们延迟几个小时并不是什么大不了的事,但它不应该是一整天而且不应该是整整一周.

我很乐意通过以下工作替换我AbstractExecutionThreadService的所有s和AbstractScheduledServices:

  • 无论如何,立即启动优先级最高的任务.
  • 仅在总负载"小"时启动中优先级任务.
  • 仅当系统"大部分空闲"时才启动优先级最低的任务.
  • 使用提供的公式增加延迟任务的优先级.

这肯定听起来很模糊,让它更精确是我要问的一部分.我的竞争目标是

  • 永远不要拖延重要的任务.
  • 永远不要让太多同时运行的任务太慢地使服务器变慢.

没有硬性截止日期,也没有必要尽量减少使用的线程数.我并不坚持完全按照我的描述做出解决方案,我不是在寻找一个库(我也没有坚持重新发明轮子).我不认为类似cron的调度程序是正确的解决方案.

Mik*_*phy 0

我认为你已经非常接近你想要的了,也许只需要一点鼓励/认可/同意就足够了

我的想法是“如果我知道可以运行的最大并发线程数,那么我将如何针对 3 个线程队列共享这些线程”。

一旦我知道了这一点,我就可以设置 3 个队列,每个队列都有不同的可用线程份额。- 优先级 1(最高)获得 50% 的工作 - 优先级 2 获得 35% 的工作 - 优先级 3(最低)获得 15% 的工作