关于队列使用场景的困惑

发现好多教材或者文章喜欢使用队列,很多时候,我感觉可能直接触发一条 SQL 语句即可完成,为什么要使用队列呢?我队列驱动使用 database 做了一个测试,取出用户表中没有认证邮箱的用户,标记为邮箱已认证。

 public function verified()
    {
        $users = User::where('email_verified','0')->get();
        \DB::enableQueryLog();
        foreach ($users as $user) {
            \App\Jobs\EmailVerified::dispatch($user);
        }
        dump(\DB::getQueryLog());
        return 'finish';
    }

file

结果表明其实使用队列,其实是需要把队列需要处理的数据写入 jobs 表,才会返回 return 'finish'。而这个过程其实是比较漫长的。为什么我们不直接操作数据库呢。当然,如果选择 redis 或者 beanstalkd 驱动确实会快,单本质是一样的

    public function verified()
    {
        $users = User::where('email_verified','0')->get();
        foreach ($users as $user) {
            $user->update(['email_verified'=>1]);
        }
        return 'finish';
    }
    或者
     public function verified()
    {
        User::where('email_verified','0')->update(['email_verified'=>1]);
    }

个人理解队列的使用场景应该是那些处理时间比较长的时间的事情,一般来说是针对短信,邮件获取其他与第三方接口对接的应用比较实用。如果你的事件只是需要改动数据表中的某个字段值的话,则不如直接对数据库做修改比较方便,而不要实用队列。不知道理解的对不对

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
leo
最佳答案

这里用队列的目的是 发送邮件 而不是把 email_verified 标记成 1,而发邮件是一个长耗时的操作。

5年前 评论
讨论数量: 4
leo

这里用队列的目的是 发送邮件 而不是把 email_verified 标记成 1,而发邮件是一个长耗时的操作。

5年前 评论

@leo 可能这个问题在你这个章节里并不适合,因为你此处确实是需要队列。而我的困惑是类似于上面我说的那个问题。我知道队列的应该是发送邮件。我想表达的是,像发邮件这种耗时的操作确实适合使用队列,但在实际场景中,很多不是耗时的操作,比如直接触发某个数据库的修改 也会直接使用队列,我觉得就不合适了。很多人使用队列可能是为了速度更快,可是这样并不会更快,使用者可能并不知道这样。今天又问了朋友,他说队列只是让数据更合法,并不会变得更快
对了,其实我并没有做发送邮件。队列里面直接是做了数据修改

  public function handle()
    {
        $this->user->update(['email_verified'=>1]);
    }

我只是随便举例而已,就是表明直接修改数据库的操作,为什么需要放入队列中

5年前 评论
leo

@小龙 只有数据库读写也有可能是个长耗时的操作,比如做一些数据统计相关的操作。

5年前 评论
UKNOW

这个里面也是有个守护进程一直在坚挺队列是否有数据 如果有就处理

3年前 评论

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