寻找有效的任务计划程序

mad*_*do7 0 php sql queue multithreading scheduled-tasks

我有几个工作需要完成X次,我有不同的工人有自己的信息.

除了工作有一个日期,我想在从最老的工作开始到下一个工作之前处理一个工作Y次.

工人只能处理一次工作.

目前我正在使用一个mysql数据库来实现这个以及作为工作者的PHP脚本,但似乎每秒约有50个作业存在瓶颈,我需要更快,所以我必须寻找替代方案.

我的设置有以下表格:

jobs

job_id  | job_info  | last_processed    | times_executed    | to_be_done
1   | 949461321 | 05-04-2014 00:14:56   | 192               | 1000
2   | 356454214 | 05-04-2014 00:14:57   | 8                 | 200
3   | 321564642 | 05-04-2014 00:14:58   | 16                | 10000
4   | 546412131 | 05-04-2014 00:14:59   | 3                 | 50

workers 

worker_id   | specific_information  | status
1       | 4656439897543521456       | ok
2       | 6513165165465498498       | not_responsive
3       | 1046486479849870987       | not_responsive
4       | 6540498465494131131       | ok
5       | 6484654321654657498       | ok
Run Code Online (Sandbox Code Playgroud)

除此之外,我还有以下设置(为简单起见,这里是伪代码):

$jobs_per_run = 10; // Process 10 jobs when the script runs
$workers_per_run = 5; // Process each job 5 times before it moves to the next job

FOR $i = 0; $i < $jobs_per_run; $i++ {
    SQL_QUERY "SELECT * FROM jobs WHERE times_executed < to_be_done GROUP BY last_processed ASC"; // get least used job that needs processing
    FOR $j = 0; $j < $workers_per_run; $j++ {
        SQL_QUERY "SELECT * FROM workers WHERE status = 'ok' AND worker_id NOT IN($processed_workers)";
        IF job_was_executed_successfully {
            SQL_QUERY "UPDATE jobs SET times_executed = times_executed + 1, last_processed = NOW() WHERE job_id = $job_id";
        } else {
            SQL_QUERY "UPDATE workers SET status = 'not_responsive' WHERE worker_id = $worker_id"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这能解释我的需求.我甚至不知道这实际上是如何调用的.

我读过有关queues,task schedulersmessaging systems但这里的问题是,我需要通过last_processed排序不同的工人执行作业几次.

我认为我提到的这些结构就像你抛出一些工作一样,并且它们会被一个又一个地执行.通过我的设置,我想我需要从一开始就分配工人,然后例如将工作1分配给分配给不同工人的1000次.

对我来说有一个问题.有时候工作人员不能随时可用,如果我将工作人员1列入工作2,那么如果它在几分钟内被执行并且工人1在那时没有响应则将是无用的.这就是为什么我目前在执行时分配一名工人到工作岗位的原因.

task scheduler将需要比这更易于管理,我需要能够暂停和恢复单个的工作,并选择他们基于不同标准的工人他们的"表行"内的所在.

我希望有300多名工作人员在没有问题的情况下在队列系统上工作.一名工人在大约1秒钟内执行一项工作,这样每秒就能完成300多个工作.

理想情况下,我想拥有像Amazon AWS这样的云设置,其中我有一个实例作为任务调度程序和其他几个执行作业的实例.

获得这样的东西的最佳设置是什么?我现在的mysql解决方案似乎最方便和适合.也许有一个更快的数据库用于具有类似功能的工作?

Joe*_*ins 6

尽管什么我们的老师告诉我们,还有就是这样的事情作为一个愚蠢的问题; 这就是你到目前为止没有得到合适答案的原因.

在这个场合,我会花时间解释为什么这个问题很愚蠢,希望未来的读者和你自己都能从中受益,而不是忽略你提出的问题.

我希望有300多名工作人员在没有问题的情况下在队列系统上工作

这表明存在误解; 它表明你认为你的硬件能够同时执行300个线程,但事实并非如此:我敢打赌在我们有生之年不会有这样的硬件供我们使用.

使用pthreads在PHP中进行多线程处理

有一种浪费的倾向; 认为线程化可以使其更快,而不是更快,这是一种常见的误解.更多的线程并不总是等同于更多的吞吐量,就像更多的水并不总是等于更潮湿一样.

更多的水!==更湿润

在盒子外面思考是一个优秀的多线程程序员的先决条件; 常识应该要求更多的水确实意味着更潮湿,但是如果你考虑到碗底部的中心点:一旦它被弄湿,无论你放在顶部有多少水,它都不会变得更湿润......

太多的水或线程,你会淹死.

您应该阅读所有引用的文档,它应该让您很好地了解可能的内容以及如何实现.