消息队列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 App\Jobs;

class ProcessPodcast implements ShouldQueue
{
    /**
     * 任务运行的超时时间。
     *
     * @var int
     */
    public $timeout = 120;
}

  指定队列:

php artisan queue:work redis --queue=emails

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

 

  

    

posted @ 2018-10-02 00:46  泥土里的绽放  阅读(1066)  评论(2编辑  收藏  举报