Laravel 的队列的任务链接是否保证了消费顺序?
新建了两个job类,分别是StudyJob
和TeacherJob
//StudyJob
public function handle()
{
echo $this->name . PHP_EOL;
}
//TeacherJob
public function handle()
{
echo $this->teacherId . PHP_EOL;
}
和一个控制器SchoolController
public function TeacherCallStudentsName()
{
$data = [
'张三',
'张4',
'张5',
'张6',
'张7',
'张8',
'张9',
'张10',
'张11',
];
foreach ($data as $k => $v) {
$this->queueRun($v, $k);
}
return [
'code' => 200
];
}
protected function queueRun($name, $id)
{
StudyJob::withChain([
new TeacherJob($id)
])->dispatch($name);
}
然后我先只使用一个消费者,然后请求一下看看结果。
/www/study # php artisan queue:work
[2020-03-23 05:11:35][rVpuaImiVCjcxQZ4w4fTmq9Ir2nQ1GHE] Processing: App\Jobs\StudyJob
张三
[2020-03-23 05:11:35][rVpuaImiVCjcxQZ4w4fTmq9Ir2nQ1GHE] Processed: App\Jobs\StudyJob
[2020-03-23 05:11:35][utirHewP3d8hzJ4t3m5ZfGcozFM57Yu0] Processing: App\Jobs\StudyJob
张4
[2020-03-23 05:11:35][utirHewP3d8hzJ4t3m5ZfGcozFM57Yu0] Processed: App\Jobs\StudyJob
[2020-03-23 05:11:35][Tme5Va0YbBAzzlVARxiSLaXPOHcSQ4ss] Processing: App\Jobs\StudyJob
张5
[2020-03-23 05:11:35][Tme5Va0YbBAzzlVARxiSLaXPOHcSQ4ss] Processed: App\Jobs\StudyJob
[2020-03-23 05:11:35][L1kV3sftYMAERfAay8ltVpA2tDwlEvt4] Processing: App\Jobs\StudyJob
张6
[2020-03-23 05:11:35][L1kV3sftYMAERfAay8ltVpA2tDwlEvt4] Processed: App\Jobs\StudyJob
[2020-03-23 05:11:35][slXfov07kVbdLD2fqFyByJWDQrnEG1rV] Processing: App\Jobs\StudyJob
张7
[2020-03-23 05:11:35][slXfov07kVbdLD2fqFyByJWDQrnEG1rV] Processed: App\Jobs\StudyJob
[2020-03-23 05:11:35][6zUrmOsUNNDJBPpkVCEBLa1w1LRULQdQ] Processing: App\Jobs\StudyJob
张8
[2020-03-23 05:11:35][6zUrmOsUNNDJBPpkVCEBLa1w1LRULQdQ] Processed: App\Jobs\StudyJob
[2020-03-23 05:11:35][6hiIynhB7VxeTTrnzE17JS3Pjrq3Ii9G] Processing: App\Jobs\StudyJob
张9
[2020-03-23 05:11:35][6hiIynhB7VxeTTrnzE17JS3Pjrq3Ii9G] Processed: App\Jobs\StudyJob
[2020-03-23 05:11:35][Qg7iqCjeVGlTb41mjRWOU7noab5tJBR1] Processing: App\Jobs\StudyJob
张10
[2020-03-23 05:11:35][Qg7iqCjeVGlTb41mjRWOU7noab5tJBR1] Processed: App\Jobs\StudyJob
[2020-03-23 05:11:35][5i2qt00sPRjfVSQMB3vP1T0GnZz50sQc] Processing: App\Jobs\StudyJob
张11
[2020-03-23 05:11:35][5i2qt00sPRjfVSQMB3vP1T0GnZz50sQc] Processed: App\Jobs\StudyJob
[2020-03-23 05:11:35][n8nemYnt1cd0pqePCb8ruKpMLfzPkDbZ] Processing: App\Jobs\TeacherJob
0
[2020-03-23 05:11:35][n8nemYnt1cd0pqePCb8ruKpMLfzPkDbZ] Processed: App\Jobs\TeacherJob
[2020-03-23 05:11:35][ZlHx0kd2usiWnbFzQqa5TpKL9MyorVEn] Processing: App\Jobs\TeacherJob
1
[2020-03-23 05:11:35][ZlHx0kd2usiWnbFzQqa5TpKL9MyorVEn] Processed: App\Jobs\TeacherJob
[2020-03-23 05:11:35][qMoJt5j0X8UVqanMJC5HdbyFu9sDqiu8] Processing: App\Jobs\TeacherJob
2
[2020-03-23 05:11:35][qMoJt5j0X8UVqanMJC5HdbyFu9sDqiu8] Processed: App\Jobs\TeacherJob
[2020-03-23 05:11:35][ST8ql3ah1l9sfXItj4XAIdFvnMLNmy3x] Processing: App\Jobs\TeacherJob
3
[2020-03-23 05:11:35][ST8ql3ah1l9sfXItj4XAIdFvnMLNmy3x] Processed: App\Jobs\TeacherJob
[2020-03-23 05:11:35][rfX0D29sDPlI8uB4cw3qH6ncxStdNPQA] Processing: App\Jobs\TeacherJob
4
[2020-03-23 05:11:35][rfX0D29sDPlI8uB4cw3qH6ncxStdNPQA] Processed: App\Jobs\TeacherJob
[2020-03-23 05:11:35][KtXnkUkEo3hOVP9QB4HEl3nnzydeawBf] Processing: App\Jobs\TeacherJob
5
[2020-03-23 05:11:35][KtXnkUkEo3hOVP9QB4HEl3nnzydeawBf] Processed: App\Jobs\TeacherJob
[2020-03-23 05:11:35][eDFQVAcg9aT8He2Otpho5fpFd5a1fRvQ] Processing: App\Jobs\TeacherJob
6
[2020-03-23 05:11:35][eDFQVAcg9aT8He2Otpho5fpFd5a1fRvQ] Processed: App\Jobs\TeacherJob
[2020-03-23 05:11:35][8t0CqhPgUgYqWthyExv78OrATbazBIaw] Processing: App\Jobs\TeacherJob
7
[2020-03-23 05:11:35][8t0CqhPgUgYqWthyExv78OrATbazBIaw] Processed: App\Jobs\TeacherJob
[2020-03-23 05:11:35][bxDhuU6F12EAkuzIEwNmQwemYbTfgd8Y] Processing: App\Jobs\TeacherJob
8
[2020-03-23 05:11:35][bxDhuU6F12EAkuzIEwNmQwemYbTfgd8Y] Processed: App\Jobs\TeacherJob
我们可以看到任务链接保证了队列的先后顺序,先是老师呼叫了学生名字,然后打印老师id。那么消费者不止一个的时候,是否任务链接可以保证消费顺序呢?
我发现粘连复制控制台输出,样式不好看,直接截图吧。
丧心病狂的我,开了三个消费者,然后狂点了两次postman,下面分别是第一次和第二次的截图。
然后我们会看到,依旧是先是老师呼叫了学生名字,然后打印老师id。但是消费者顺序却没有得到保证,当然这个就看业务场景是否严格了。
那么怎么让消费者也乖乖按顺序消费,看队列顺序性引发的思考 就好了。
文档中任务链接是这样描述的:
任务链接允许您指定一组应在主任务成功执行后按顺序运行的排队任务。如果序列中的一个任务失败,其余的任务将不会运行。要执行一个排队任务链,你可以在你的任何可调度任务上使用 withChain 方法:
它是让不同的任务,有一个顺序。而不是说该任务中,消费者顺序消费,是两个不一样的概念。
如有错误,欢迎指出。
本作品采用《CC 协议》,转载必须注明作者和本文链接
楼主怎么实现顺序消费的?
如业务有消费顺序要求,应使用 chain