laravel_Supervisor队列
Queue
1. 队列驱动
- //数据库驱动,修改.env的QUEUE_DRIVER
- QUEUE_DRIVER=database
1. 数据库表
- php artisan queue:table
- php artisan queue:failed-table
- php artisan migrate
3.创建任务类
- <?php
- namespace App\Jobs;
- use Illuminate\Support\Facades\Log;
- class LogTestJob extends Job
- {
- /**
- * Create a new job instance.
- *
- * @return void
- */
- public function __construct()
- {
- //
- }
- /**
- * Execute the job.
- *
- * @return void
- */
- public function handle()
- {
- sleep(5);
- for($i = 1; $i <= 10000; $i ++) {
- Log::info("--$i--");
- }
- }
- }
1. 分发任务
- <?php
- namespace App\Http\Controllers;
- use App\Jobs\LogTestJob;
- use Illuminate\Support\Facades\Queue;
- use Laravel\Lumen\Routing\Controller as BaseController;
- class TestController extends BaseController
- {
- /**
- * 测试队列任务分发
- * @description
- * @author csl
- */
- public function logTestJob(){
- $job = (new LogTestJob())->onQueue('log');// 任务将被委派到 "log" 队列
- dispatch($job);
- }
- }
1. 运行队列进程
- //监听queue为"log"的队列
- php artisan queue:work --queue=log
- //监听queue为"default"的队列,--queue默认为default
- php artisan queue:work
- //onQueue方法指定queue的名称
- $job = (new LogTestJob())->onQueue('log');
1. 任务过期
`config/queue.php` 配置文件里,每一个队列连接都定义了一个 ` retry_after ` 选项。这个选项指定了任务最多处理多少秒后就被当做失败重试了。比如说,如果这个选项设置为 ` 90 `,那么当这个任务持续执行了 ` 90 ` 秒而没有被删除,那么它将被释放回队列。通常情况下,你应该把 `retry_after` 设置为最长耗时的任务所对应的时间。
1. 任务超时
` queue:work ` Artisan 命令对外有一个 ` --timeout ` 选项,默认60秒。这个选项指定了 `Laravel` 队列处理器最多执行多长时间后就应该被关闭掉。有时候一个队列的子进程会因为很多原因僵死,比如一个外部的 HTTP 请求没有响应。这个 `--timeout` 选项会移除超出指定事件限制的僵死进程。
- <?php
- namespace App\Jobs;
- class ProcessPodcast implements ShouldQueue
- {
- /**
- * 任务运行的超时时间。
- *
- * @var int
- */
- public $timeout = 120;
- }
- 或 php artisan queue:work --timeout=120
` retry_after ` 配置选项和 ` --timeout` 命令行选项是不一样的,但是可以同时工作来保证任务不会丢失并且不会重复执行。
` --timeout ` 应该永远都要比 ` retry_after` 短至少几秒钟的时间。这样就能保证任务进程总能在失败重试前就被杀死了。如果你的 `--timeout` 选项大于 `retry_after` 配置选项,你的任务可能被执行两次。
1. 配置Supervisor
**安装Supervisor**
Supervisor 是 Linux 系统中常用的进程守护程序。如果队列进程 queue:work 意外关闭,它会自动重启启动队列进程。在 Ubuntu 安装Supervisor 非常简单:
- sudo apt-get install supervisor
**配置Supervisor**
Supervisor 配置文件通常存放在 ` /etc/supervisor/conf.d ` 目录,在该目录中,可以创建多个配置文件指示 `Supervisor` 如何监视进程,例如,让我们创建一个开启并监视`queue:work` 进程的 BBB_log_queue.log 文件:
- [program:BBB_log_queue]
- process_name=%(program_name)s_%(process_num)02d
- command=php /home/chaishuliang/www/BBB/artisan queue:work --queue=log --delay=5 --sleep=3 --tries=3
- autostart=true
- autorestart=true
- ;user=forge
- numprocs=5
- redirect_stderr=true
- stdout_logfile=/home/chaishuliang/www/supervisor/stdout_log/BBB_log_queue.log
**启动Supervisor**
当你成功创建配置文件后,你需要刷新 Supervisor 的配置信息并使用如下命令启动进程:
- sudo supervisorctl reread
- sudo supervisorctl update
- sudo supervisorctl start BBB_log_queue:* //Start all processes in a group,BBB_log_queue共5个进程(numprocs)
- 或 sudo supervisorctl start all
1. 队列处理器 & 部署
因为队列处理器都是 long-lived 进程,如果代码改变而队列处理器没有重启,他们是不能应用新代码的。所以最简单的方式就是重新部署过程中要重启队列处理器。你可以很优雅地只输入 `queue:restart` 来重启所有队列处理器。
- php artisan queue:restart //修改代码后执行,队列才会读取新代码
laravel_Supervisor队列的更多相关文章
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- 消息队列 Kafka 的基本知识及 .NET Core 客户端
前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...
- Beanstalkd一个高性能分布式内存队列系统
高性能离不开异步,异步离不开队列,内部是Producer-Consumer模型的原理. 设计中的核心概念: job:一个需要异步处理的任务,是beanstalkd中得基本单元,需要放在一个tube中: ...
- .net 分布式架构之业务消息队列
开源QQ群: .net 开源基础服务 238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...
- 【原创经验分享】WCF之消息队列
最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...
- 缓存、队列(Memcached、redis、RabbitMQ)
本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...
- Java消息队列--ActiveMq 实战
1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...
- Java消息队列--JMS概述
1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...
- 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)
Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...
随机推荐
- c++问题集合
1.对于程序未运行和运行后的代码段到底存储什么? 2.编写程序时为什么先申请变量后使用? 3.malloc本质到底分配了什么?谁赋给的? 4.程序在系统上是怎么运行起来的? 5.当我们双击一个程序运行 ...
- trie树的应用;
链接:https://ac.nowcoder.com/acm/contest/920/B来源:牛客网 定义一张图的生成链是原图的一棵生成树,且这棵树退化成一条链.我们称一条生成链是原图的最小生成链,当 ...
- c++ 容器反转
// reverse algorithm example #include <iostream> // std::cout #include <algorithm> // st ...
- go区分操作系统
package main import ( "fmt" "runtime" ) func main() { fmt.Println("Go runs ...
- jQuery 的on()方法
jQuery 的on()方法 一.总结 一句话总结: 1.普通添加事件:$("a").on("click", function () {执行的代码}) 2.未创 ...
- 淘宝rem适配方案
/*px 转化换 rem ,转化是 10 .比如:你的设计图为750,那么就 750 / 75 = 10 rem.设计图中你量尺寸都要除 75 就是 rem值.再比如量的设计图按钮宽度 66px,那么 ...
- leetcode 96. Unique Binary Search Trees 、95. Unique Binary Search Trees II 、241. Different Ways to Add Parentheses
96. Unique Binary Search Trees https://www.cnblogs.com/grandyang/p/4299608.html 3由dp[1]*dp[1].dp[0]* ...
- Qt编写安防视频监控系统2-视频播放
一.前言 视频播放功能是核心功能之一,为了统一管理接口,统一封装成一个控件,对外提供seturl open close方法即可,不用去管内部的具体处理,这样就可以提供多种接口来实现统一的管理,比如vl ...
- Python操作memecache
memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载,故常用来做数据库缓存.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态 ...
- unity读取灰度图生成三维地形mesh
准备灰度图 IGray.png及草地贴图 IGrass.jpg ,放入Assets下StreamingAssets文件夹中. 创建空材质,用作参数传入脚本. 脚本如下,挂载并传入材质球即可 ...