Laravel 的队列的任务链接是否保证了消费顺序?

新建了两个job类,分别是StudyJobTeacherJob


//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,下面分别是第一次和第二次的截图。

关于laravel的队列的任务链接问题

关于laravel的队列的任务链接问题

然后我们会看到,依旧是先是老师呼叫了学生名字,然后打印老师id。但是消费者顺序却没有得到保证,当然这个就看业务场景是否严格了。

那么怎么让消费者也乖乖按顺序消费,看队列顺序性引发的思考 就好了。

文档中任务链接是这样描述的:

任务链接允许您指定一组应在主任务成功执行后按顺序运行的排队任务。如果序列中的一个任务失败,其余的任务将不会运行。要执行一个排队任务链,你可以在你的任何可调度任务上使用 withChain 方法:

它是让不同的任务,有一个顺序。而不是说该任务中,消费者顺序消费,是两个不一样的概念。

如有错误,欢迎指出。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 2

楼主怎么实现顺序消费的?

3个月前 评论
L学习不停 (楼主) 3个月前

如业务有消费顺序要求,应使用 chain

3个月前 评论
L学习不停 (楼主) 3个月前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!