作者:志强旻茜青民 | 来源:互联网 | 2023-08-14 19:01
在很多项目业务复杂到一定程度、项目大到一定程度,就都是一些重构、优化、升级等手段,让项目更稳健;能抵挡更强的“风暴”。而 异步服务器 则也是减轻服务器压力,提高项目性能的一个常见手
在很多项目业务复杂到一定程度、项目大到一定程度,就都是一些重构、优化、升级等手段,让项目更稳健;能抵挡更强的“风暴”。而 异步服务器
则也是减轻服务器压力,提高项目性能的一个常见手段之一,把一些实时性不强,而且量还比较大的业务可以异步
来解决。临近年底了,丢丢哥最近工作比较忙,博客更新少了点。见谅
本篇博客主要介绍 异步消息队列
简要的介绍下同步消息队列
本篇博客为了更明确异步消息队列
和同步消息队列
的实现原理 以MySQL
消息队列为示例,但是在真正的项目中(如果没有单独的异步服务器,则建议使用Redis
消息队列)
一、简介
Laravel
的队列服务为不同的队列后端系统提供了一套统一的 API
。队列允许你将一个耗时的任务进行延迟处理,例如像 e-mail
发送。这能让应用程序对页面的请求有更快的响应。
二、配置
队列的配置文件被保存在 config/queue.php
中。但是Laravel
中优先选用.env
的配置在这个文件内你可以找到包含在 Laravel
中的每一种队列驱动连接设置。它们包含了数据库、Beanstalkd、IronMQ、Amazon SQS、Redis 以及提供本机使用的 synchronous 驱动。
.env配置同步:
.env配置异步:
另外框架也提供了 null 这个队列驱动用来丢弃队列任务。
1.生成队列数据库表与失败队列数据库表
本实例中是用群发email的实例,如果模仿,请配置自己的邮件服务
php artisan queue:table
php artisan queue:failed-table
php artisan migrate
2.创建Mysql数据(需要发邮件)
3.生成队列任务
php artisan make:job SendUserEmail
然后在项目的App\Jobs
里面会生成一个SendUserEmail.php
文件
接下来 我们再生成一个控制器UserController
php artisan make:controller UserController
Route::resource('/user','UserController');
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Jobs\CreateMessage;
use App\Jobs\SendUserEmail;
class UserController extends Controller
{
...
...
namespace App\Jobs;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Mail;
class SendUserEmail extends Job implements SelfHandling, ShouldQueue
{
use InteractsWithQueue, SerializesModels;
protected $name;
protected $email;
三、执行程序
1.我们env是设置的database
(异步消息队列)
2.开启队列监听
php artisan queue:listen
3.或者 开启后台监听(不影响自己输入其他命令)
php artisan queue:listen &
4.也能用work 后面参数是休息时间和尝试次数
php artisan queue:work connection --daemon --sleep=3 --tries=3
5.访问网址(这个网址是我自己本地的)
6.然后看我的Mysql的变化jobs表本来有8条队列数据需要处理
7.然后看终端监听的变化
8.消息队列被一条条的推送..反观数据库jobs的变化,发现被清空了,说明队列执行完了
而且页面并不是等待邮件发完才跳转,而是发送这个队列命令后直接重定向到了user列表页面(跳转很快),这就是异步队列的整个工作流程
当然如果你看了我之前的一片文章也可以做做全局SQL监听,你就会在日志中发现,每执行一个队列 job表里面就要执行4次命令增、删、改、查
,如果是10000条数据的队列就是40000次的表操作,所以说database的消息队列用也得当心,虽然是异步的,考虑的因素还是比较多的。
全局SQL监听-5.1
同步消息队列
这个消息队列,说实话丢丢哥我也是用得少,为什么呢?暂时并没有发现它的应用场景的优势。
与异步不同的是设置同步消息队列 将.env
或config/queue.php
里面的配置改成是 sync
然后执行页面的时候发现页面等待跳转的时间很长,得所有的邮件发送完成后才会跳转页面(如果队列中有任务执行失败反复的参试 那这页面应该肯定timeout了)
扩展思路
1.队列有可能失败,失败的队列会写入到mysql
的failed_jobs
表里面:
2.那么如何让这些失败的队列让电脑后面自动去执行消息推送呢?也就是执行这些命令,怎么让程序自动完成
3.如果是在一个服务器中用消息队列,是不是一直要开常驻进程??那是不是有消耗?当异步到达一个程度的时候,是不是可以开服务器集群里面的异步服务器
专门来做这个事??
希望我的博客对你们有所帮助,你的认可就是我最大的动力。。
https://www.blog8090.com/
本文为作者原创,允许转载,转载后请以链接形式说明文章出处. 如转载但不标明来源,后果自负。