[英]set a queue to run jobs one at a time
在我的应用程序中,我有一条路线可以获取大量对象并将其分块到更小的部分(例如,每个部分 250 行)并将每个部分推送到队列中。 但是此数据必须逐行处理,并且每个作业必须仅在前一个作业完成后运行。 因为每一行都依赖于它之前的一些行
我的队列驱动程序是 redis 和地平线,它执行作业的速度非常快。 我尝试使用后面的方法并设置动态延迟。 但它不能解决我的问题。 因为客户端可能无法处理大数据并将其数据拆分(对其进行分页)并将它们发送到我的 api。因此每个请求中的数据必须添加到队列的末尾。
现在我将每个部分三次添加到队列中,如下所示。 但我正在寻找更好的方法
foreach ($dataParts as $i => $dataPart) {
Queue::later((($i * 5)), new ImportData($dataPart));
Queue::later((($i * 60) ), new ImportData($dataPart));
Queue::later((($i * 120)), new ImportData($dataPart));
}
我尝试了作业批处理,但仍然没有解决我的问题。 然后尝试了 withoutOverlaping 方法,但也没有用。
最后,我在 horizon.php 文件中添加了一个新的 worker 和队列,并为其设置了maxProcess => 1
。 并将我的工作推向那个。 并按照我的意愿工作
地平线.php:
...
...
...
'defaults' => [
// the default queue
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default'],
'balance' => 'auto',
'maxProcesses' => 10,
'memory' => 128,
'tries' => 1,
'nice' => 0,
],
// new queue process only one job at a time
'supervisor-single' => [
'connection' => 'redis',
'queue' => ['single-queue'],
'balance' => 'auto',
'maxProcesses' => 1,
'memory' => 128,
'tries' => 1,
'nice' => 0,
],
],
在 controller 中:
foreach ($dataParts as $dataPart) {
Queue::push(new ImportData($dataPart), null, 'single-queue');
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.