消息队列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
如果你想多线程的话,可以多起几个。