前言


Laravel的队列可以用在轻量级的队列需求中。比如我们系统中的短信、邮件等功能,这些功能有一些普遍的特征,异步、重试、并发控制等。Laravel现在主要支持的队列服务有Null、Sync、Database、Redis、Beanstalkd、Sqs。
在我们的项目中(消息中心、人事)用的主要是redis,接下来我会介绍下队列基于redis驱动的运行机制。

背景知识


Laravel启动后,加载config/app.php的providers数组中的服务提供者 QueueServiceProvider,在队列服务提供者中,已经注册了一系列相关服务。

在.env配置文件中,我们设置了QUEUE_DRIVER为redis,系统启动后会自动生成Redis连接,同时注册了Work消费者,队列监听器以及错误服务。在queue.php和database.php配置中都默认了相关的redis设置。

任务调度


调度如下:

laravel 的队列服务由两个进程控制,一个是事件生产者(黑线),一个是事件消费者(黄线)。
有三个队列,主队列 queues:default(下面default代替),延时队列 queues:default:delayed(下面delayed代替),待处理队列 queues:default:reserved(下面reserved代替)。所有的队列事件都由事件消费者去消费主队列中的事件。(队列名称default在queue.php中被定义)

1. 事件触发:dispatch(new Event());

事件触发后,dispatch判断Event是否继承队列类,是,将事件分发到队列执行流程中。队列执行流程会根据Event的延时属性判断,否,将Event放到即时处理queues:default 队列中,是,将Event放入延时 queues:default:delayed 队列中。

2. 消费:php artisan queue:work

图中A、B、C、D为消费者进程依次执行步骤,淡黄色背景的代码备注都为对队列的操作命令(predis 实现redis api),每个备注里面对事件的操作要么一起成功,要么一起失败(Lua脚本)。

3. A: 对delayed、default队列操作

A1:取出小于当前时间的(时间戳)所有Event,赋给val,删除delayed队列中0到val.length长度的Event(redis的有序集合有一个分数,有序集合根据这个分数从小到大排序,这里的时间戳就是分数)。
A2:将上面获取的Event,放入到主队列 default。

4. B: 对reserved、default队列操作

B1:取出小于当前时间的所有Event,赋给val,删除reserved队列中0到val长度的Event。
B2:将上面获取的Event,放入到主队列 default。

5. C: 对default、reserved队列操作

C1:取出主队列中的所有Event。
C2:将Event放入reserved,且记录Event的执行次数(保留Event,由D执行后,根据Event执行结果处理这些Event)。

6. D: 处理Event(由C步骤得到的Event,交给D)

根据得到的Event依次执行(也就是通知监听这个Event的所有监听者),同时删除reserved队列的相对应的Event(无论执行失败还是成功),如果执行失败会将任务放入reserved队列中,执行时间为1540097000(1540096910 + 90,90为设置的延时时间),以便下次执行。

结尾


以上就是Laravel队列所有的执行流程,当然里面包括执行失败的错误处理、如何通知监听者等细节都没讲,大家可以自行分析代码理解。

消息中心 - Laravel的Redis队列(一)的更多相关文章

  1. laravel中redis队列的使用

    一.配置文件 首先我们需要在配置文件中配置默认队列驱动为Redis,队列配置文件是config/queue.php: return [ 'default' => env('QUEUE_DRIVE ...

  2. [原创]Laravel 基于redis队列的解析

    目录 参考链接 本文环境 为什么使用队列 Laravel 中的队列 分发任务 任务队列 Worker Last-Modified: 2019年5月10日11:44:18 参考链接 使用 Laravel ...

  3. laravel使用redis队列实践(只需6步,超详细,超简单)

    1.配置使用redis队列 在.env文件找到QUEUE_DRIVER=sync改成QUEUE_DRIVER=redis redis配置一般不用改如果有密码改.env文件的REDIS_PASSWORD ...

  4. Laravel中的队列处理

    Laravel中的队列处理 队列介绍 为什么要有消息队?这里先对其进行一个简单的介绍,方便还不了解的同学理解.在面向对象里,有一个很简单的概念--消息传递,而消息队列就可以在它上面扩展一下,把它说的更 ...

  5. netty实现消息中心(一)思路整理

    一.需求 需要实现直播间的以下功能: 群发消息(文本.图片.推荐商品) 点对点私发消息(文本.图片.推荐商品) 单个用户禁言 全体用户禁言 撤回消息 聊天记录持久化 二.技术实现 服务端消息中心采用n ...

  6. 我心中的核心组件~MSMQ与Redis队列

    回到目录 这个文章其实是我心中的核心组件的第七回,确实在时间上有些滞后了,但内容并不滞后!本文MSMQ只是个引题,我确实不太想说它,它是微软自己集成的一套消息队列,寄宿在Window服务里,稳定性十在 ...

  7. c#之Redis队列在邮件提醒中的应用

    场景 有这样一个场景,一个邮件提醒的windows服务,获取所有开启邮件提醒的用户,循环获取这些用户的邮件,发送一条服务号消息.但问题来了,用户比较少的情况下,轮询一遍时间还能忍受,如果用户多了,那用 ...

  8. RabbitMQ、Memcache、Redis(队列、缓存)

    RabbitMQ 一.解释 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消 ...

  9. redis队列的实现

    redis中文官网:http://www.redis.cn/ 关于redis队列的实现方式有两种: 1.生产者消费者模式. 2.发布者订阅者模式. 详解: 1.生产者消费者模式. 普通版本: 比如一个 ...

随机推荐

  1. SpringBootSecurity学习(20)前后端分离版之OAuth2.0刷新token

    刷新token 前面的例子和配置都是从头开始申请授权码和令牌,现在来看一下如何根据获取令牌时,回参中的 refresh_token 来刷新令牌.现在在项目中配置的是内存模式的默认用户名密码,第一步先改 ...

  2. 采坑指南——k8s域名解析coredns问题排查过程

    正文 前几天,在ucloud上搭建的k8s集群(搭建教程后续会发出).今天发现域名解析不了. 组件版本:k8s 1.15.0,coredns:1.3.1 过程是这样的: 首先用以下yaml文件创建了一 ...

  3. .netCore+Vue 搭建的简捷开发框架 (4)--NetCore 基础 -2

    上节中,我们初步的介绍了一下NetCore的一些基础知识,为了控制篇幅(其实也是因为偷懒),我将NetCore 基础分为两部分来写. 0.WebAPI 项目的建立 1..NetCore 项目执行(加载 ...

  4. 查询SQL SERVER 数据库版本号脚本语句

    数据库直接执行此语句即可select @@version 示例: Microsoft SQL Server 2014 - 12.0.2000.8 (X64)   Feb 20 2014 20:04:2 ...

  5. Kubernetes网络分析之Flannel

    Flannel是cereos开源的CNI网络插件,下图flannel官网提供的一个数据包经过封包.传输以及拆包的示意图,从这个图片中可以看出两台机器的docker0分别处于不同的段:10.1.20.1 ...

  6. sql获取各种时间格式的方法

    ),)--月/日/年 ),)--年.月.日 (常用) ),)--日/月/年 ),)--日.月.年 ),)--日-月-年 ),)--日 月 年

  7. 如何成为一个伟大的 JavaScript 程序员

    这篇文章主要概述在我5年工作经验的基础上,我成为优秀JavaScript开发人员所使用的技术和资源. 当前大多数Web开发人员面临着这样一个共同的问题:他们必须在多个不同的领域领先于他人——从数据库到 ...

  8. 关于StreamReader的知识分享

    今天我们来简单的介绍一下StreamReader,在将StreamReader之前,我们先来了解一下他的父类:TextReader.对于TextReader,大家可能比较陌生,下面我们来看一下Text ...

  9. Flink实战| Flink+Redis实时防刷接口作弊

    随着人口红利的慢慢削减,互联网产品的厮杀愈加激烈,大家开始看好下沉市场的潜力,拼多多,趣头条等厂商通过拉新奖励,购物优惠等政策率先抢占用户,壮大起来.其他各厂商也紧随其后,纷纷推出自己产品的极速版,如 ...

  10. php中转菜刀脚本过狗免杀

    <?php $target="url";//shell 地址 菜刀连这个脚本做中转 $post=''; $i=0; foreach($_POST AS $K=>$V) ...