• 消息队列queue


    前言 

      最近在做一个项目,做项目的过程中遇到了要使用queue的场景,芳哥跟我说,这个你可以用队列来实现。我想了想,嗯?队列,队列不就是先进先出的哪一种吗?后来翻看laravel文档发现,原来queue并不是我所想的数据结构的队列,而是另外一种东西。

    正文

    1. 为什么要用queue?

      比如有大量的请求一下发过来,服务器来不及处理,而用户急需回应,这个时候你就需要先给用户回应,然后慢慢的去处理这些请求。在这个项目中,因为涉及到文件上传,如果单线程执行的话,系统资源没有充分被利用,而且刷新目录的时候,要等文件上传完才会出现完整的目录结构,对于用户来说体验不是很友好,所以就使用queue来处理了。

    2. 怎么使用queue?

      队列的思想就是先把待执行的任务存下来,然后你再启用服务,去执行这些队列里的任务。

      (1)连接

         所谓的连接就是你把这些任务存在哪里,一般可以存在数据库中,redis中。

         config/queue.php 配置文件里,有一个 connections 配置选项。这个选项给 Amazon SQS,Beanstalk,或者 Redis 这样的后端服务定义了一个特有的连接。不管是哪一种,一个给定的连接可能会有多个 「队列」,而 「队列」 可以被认为是不同的栈或者大量的队列任务。

       queue 配置文件中每个连接的配置示例中都包含一个 queue 属性。这是默认队列任务被发给指定连接的时候会被分发到这个队列中。换句话说,如果你分发任务的时候没有显式定义队列,那么它就会被放到连接配置中 queue 属性所定义的队列中:

    // 这个任务将被分发到默认队列...
    Job::dispatch();
    
    // 这个任务将被发送到「emails」队列...
    Job::dispatch()->onQueue('emails');

    设置超时时间:
    <?php
    
    namespace AppJobs;
    
    class ProcessPodcast implements ShouldQueue
    {
        /**
         * 任务运行的超时时间。
         *
         * @var int
         */
        public $timeout = 120;
    }

      指定队列:

    php artisan queue:work redis --queue=emails

    如果你想多线程的话,可以多起几个。

     

      

        

  • 相关阅读:
    第一周编程总结
    7-3 抓老鼠亏了还是赚了
    7-1 打印沙漏
    2019春第十二周作业
    2019春第十一周作业
    2019年春第十周作业
    第九周作业总结
    第八周作业总结
    第七周作业总结
    第六周作业
  • 原文地址:https://www.cnblogs.com/cjjjj/p/9736192.html
Copyright © 2020-2023  润新知