laravel 事件与队列
队列的用途
- 解耦在项目开始时,很难预测项目的未来需求。通过在进程之间引入层,消息队列创建一个隐式的基于数据的接口,两个进程都实现。这允许您通过简单地确保它们遵守相同的接口要求来独立地扩展和修改这些进程。
- 冗余有时处理数据时进程失败。除非数据持续存在,否则它将永远丢失。队列通过持久化数据直到完全处理来缓解这一点。许多消息队列使用的put-get-delete范例需要一个进程来明确指出在邮件从队列中删除之前已经完成了处理消息,确保您的数据保持安全,直到完成。
- 可扩展性因为消息队列使您的进程脱钩,因此可以轻松地扩展将消息添加到队列或处理的速率; 只需添加另一个进程。没有代码需要更改,不需要调整任何配置。缩放比添加更多的权力一样简单。
- 弹性和刺激性当您的应用程序打到黑客新闻的首页时,您将看到不寻常的流量。您的应用程序需要能够继续运行这种增加的负载,但流量是异常的,而不是标准; 在待机状态下拥有足够的资源来处理这些尖峰是浪费的。消息队列将允许被困扰的组件通过增加的负载进行斗争,而不是通过请求过载,并且完全失败。查看我们的Spikability博客文章了解更多信息。
- 弹性当您的架构部分发生故障时,不需要将整个系统关闭。消息队列解耦过程,因此如果正在处理来自队列的消息的进程失败,那么仍然可以将消息添加到队列中以在系统恢复时进行处理。接受稍后重试或处理的请求的这种能力通常是不方便的客户和沮丧的客户之间的差异。
- 交付保证
消息队列提供的冗余保证消息将被最终处理,只要进程正在读取队列。除此之外,IronMQ还提供了一次唯一的保证。无论从队列中提取数据有多少进程,每个消息只能一次处理。这是可能的,因为检索消息“保留”该消息,暂时将其从队列中删除。除非客户明确声明已完成该消息,否则该消息将被放置在队列中,以在可配置的时间量之后进行处理。 - 订购保证
在很多情况下,处理数据的顺序很重要。消息队列是固有排序的,能够提供数据将以特定顺序处理的保证。IronMQ保证消息将使用FIFO(先进先出)处理,因此消息放在队列上的顺序是从中检索消息的顺序。 - 缓冲在任何不平凡的系统中,都将需要不同处理时间的组件。例如,上传图像所需的时间要比应用过滤器的时间要少。消息队列通过提供缓冲层来帮助这些任务以最高效率运行,而写入队列的过程可以尽可能快地编写,而不是受到从队列读取进程的准备的约束。该缓冲区有助于控制和优化数据流经您系统的速度。
- 了解数据流
在分布式系统中,掌握用户操作完成时间的长短,为什么是一个巨大的问题。消息队列通过处理速率有助于轻松识别不良数据流或数据流不最优的区域。 - 异步通信
很多次,您不想或需要立即处理消息。消息队列启用异步处理,允许您将消息放在队列上,而不是立即处理。您可以随意添加多个消息,然后随意处理。
最简单基本关键的用途,还是:异步、重试。对于耗时比较久的、需要保证送达率的,比如发送短信等,如果失败需要重新发起请求的,都适合用队列。
laravel中的队列可设置多种队列驱动连接:sync(同步执行)、database(数据库)、sqs、redis等。不同驱动链接需要不同的配置,database方式参考下面推荐博客。
命令行执行相关命令 更多命令查看下面推荐博客
php artisan queue:table 创建队列任务记录表
php artisan queue:failed-table 创建失败任务记录表 可不用创建
php artisan migrate 执行创建迁移
php artisan queue:work 执行队列
php artisan queue:restart 刷新队列(队列函数改变需重新调用执行队列)
注意:
在测试的时候,可以把 Queue driver 设置成为 sync
,这样队列就变成了同步执行,方便调试队列里面的任务。
Job 里面的 handle
方法是可以注入别的 class 的,就像在 Controller action 里面也可以注入一样。
Redis 里面一个任务默认最多执行60秒,如果一个任务60秒没有执行完毕,会继续放回到队列中,循环执行,因此必须注意自己任务的执行时间。
推荐博客 :
事件
队列通常是用来处理延迟任务的,事件广播说白点就是业务处理逻辑通知。从某种意义上来说,事件广播是一个执行动作。
比如注册流程,注册之后要做一系列的事情(验证/保存/邮件/短信/...),首先得注册完之后调用一个事件,然后这个事件再做各种各样的事
比如用户登录、购买商品、搜索、查看文章,等等,都是事件,用户在触发这个事件的时候,可能会调用执行一些内容,
通过事件监听器来监听用户触发的事件,从而执行相关内容
事件驱动主要是不同模块间的解耦,同一个模块里直接调用就可以。(注册+注册日志)
事件执行是顺序执行,看着像是异步,实际是同步的,好处就是代码组织比较科学合理 (Event执行顺序)
event事件 创建及调用 官方文档步骤说明很详细
1.app/Providers/EventServiceProvider.php 中增加绑定 监听器 与 事件执行者
'App\Extensions\Weichuang\Events\MicroportEvent' => [
'App\Extensions\Weichuang\Listeners\MicroportListener',
],
2.创建事件监听器(__construct(参数)) App\Extensions\Weichuang\Events\MicroportEvent.php
3.创建事件执行者 handle() App\Extensions\Weichuang\Listeners\MicroportListener.php
4.调用事件
use App\Extensions\Weichuang\Events\MicroportEvent;
event(new MicroportEvent($agentid,$admin_users,'userid',$content));