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 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 2

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

4年前 评论
L学习不停 (楼主) 4年前

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

4年前 评论
L学习不停 (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!