热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LaravelJobs(同步\异步)消息队列Queue晋升篇

在很多项目业务复杂到一定程度、项目大到一定程度,就都是一些重构、优化、升级等手段,让项目更稳健;能抵挡更强的“风暴”。而 异步服务器 则也是减轻服务器压力,提高项目性能的一个常见手

在很多项目业务复杂到一定程度、项目大到一定程度,就都是一些重构、优化、升级等手段,让项目更稳健;能抵挡更强的“风暴”。而 异步服务器 则也是减轻服务器压力,提高项目性能的一个常见手段之一,把一些实时性不强,而且量还比较大的业务可以异步来解决。临近年底了,丢丢哥最近工作比较忙,博客更新少了点。见谅

Laravel --Jobs (同步\异步)消息队列 Queue --晋升篇

本篇博客主要介绍 异步消息队列 简要的介绍下同步消息队列

本篇博客为了更明确异步消息队列同步消息队列的实现原理 以MySQL消息队列为示例,但是在真正的项目中(如果没有单独的异步服务器,则建议使用Redis消息队列)

一、简介

Laravel 的队列服务为不同的队列后端系统提供了一套统一的 API 。队列允许你将一个耗时的任务进行延迟处理,例如像 e-mail 发送。这能让应用程序对页面的请求有更快的响应。

二、配置

队列的配置文件被保存在 config/queue.php 中。但是Laravel中优先选用.env的配置在这个文件内你可以找到包含在 Laravel 中的每一种队列驱动连接设置。它们包含了数据库、Beanstalkd、IronMQ、Amazon SQS、Redis 以及提供本机使用的 synchronous 驱动。

.env配置同步:

Laravel --Jobs (同步\异步)消息队列 Queue --晋升篇

.env配置异步:

Laravel --Jobs (同步\异步)消息队列 Queue --晋升篇

另外框架也提供了 null 这个队列驱动用来丢弃队列任务。

1.生成队列数据库表与失败队列数据库表

本实例中是用群发email的实例,如果模仿,请配置自己的邮件服务

php artisan queue:table

php artisan queue:failed-table

php artisan migrate  
2.创建Mysql数据(需要发邮件)

Laravel --Jobs (同步\异步)消息队列 Queue --晋升篇

3.生成队列任务
php artisan make:job SendUserEmail --queued  

然后在项目的App\Jobs里面会生成一个SendUserEmail.php文件

接下来 我们再生成一个控制器UserController

php artisan make:controller UserController --resource  
  • 定义路由routes.php
Route::resource('/user','UserController');  
  • 编写控制器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  
{
   ...
   ...
   /**
     * 这个方法我们用来模拟发送消息队列.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
        $datas = \DB::table('user')->where('status',1)->get();
        foreach($datas as $data){
            $job = (new SendUserEmail($data->name,$data->email));
            $this->dispatch($job);
        }
        return redirect('/user');
    }
  • 编辑队列文件SendUserEmail.php
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;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($name, $email)
    {
        //
        $this->name = $name;
        $this->email = $email;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        // 如果参试大于三次
        if ($this->attempts() > 3) {
            \Log::info($this->name.'邮件参试失败过多');
        }else{
            // 每次进来休息3秒钟
            sleep(3);
            // 休息10秒钟
            //$this->release(10);
            $url = 'http://www.ydma.cn';
            $title = '测试邮件';
            $to = $this->email;
            // 邮件发送
            $flag = Mail::send('email.test', ['name' => $this->name, 'url' => $url], function ($message) use ($to, $title) {
                // 发送
                $message->to($to)->subject('【亲爱的程序猿】' . $title);
            });
            echo date('Y-m-d H:i:s')."\n".$to.'的邮件已发送...';

            if($flag){
                \Log::info($this->name.'邮件发送成功');
            }else{
                \Log::info($this->name.'邮件发送失败');
            }
        }



    }


    /**
     * 处理一个失败的任务
     *
     * @return void
     */
    public function failed()
    {
        \Log::error($this->name.'队列任务执行失败'."\n".date('Y-m-d H:i:s'));
    }
}

三、执行程序

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.访问网址(这个网址是我自己本地的)

Laravel --Jobs (同步\异步)消息队列 Queue --晋升篇

6.然后看我的Mysql的变化jobs表本来有8条队列数据需要处理 
Laravel --Jobs (同步\异步)消息队列 Queue --晋升篇

7.然后看终端监听的变化

Laravel --Jobs (同步\异步)消息队列 Queue --晋升篇

8.消息队列被一条条的推送..反观数据库jobs的变化,发现被清空了,说明队列执行完了 
Laravel --Jobs (同步\异步)消息队列 Queue --晋升篇

而且页面并不是等待邮件发完才跳转,而是发送这个队列命令后直接重定向到了user列表页面(跳转很快),这就是异步队列的整个工作流程

当然如果你看了我之前的一片文章也可以做做全局SQL监听,你就会在日志中发现,每执行一个队列 job表里面就要执行4次命令增、删、改、查,如果是10000条数据的队列就是40000次的表操作,所以说database的消息队列用也得当心,虽然是异步的,考虑的因素还是比较多的。

全局SQL监听-5.1

同步消息队列

这个消息队列,说实话丢丢哥我也是用得少,为什么呢?暂时并没有发现它的应用场景的优势。

与异步不同的是设置同步消息队列 将.envconfig/queue.php 里面的配置改成是 sync

然后执行页面的时候发现页面等待跳转的时间很长,得所有的邮件发送完成后才会跳转页面(如果队列中有任务执行失败反复的参试 那这页面应该肯定timeout了)

扩展思路

1.队列有可能失败,失败的队列会写入到mysqlfailed_jobs表里面:

Laravel --Jobs (同步\异步)消息队列 Queue --晋升篇

2.那么如何让这些失败的队列让电脑后面自动去执行消息推送呢?也就是执行这些命令,怎么让程序自动完成

Laravel --Jobs (同步\异步)消息队列 Queue --晋升篇

3.如果是在一个服务器中用消息队列,是不是一直要开常驻进程??那是不是有消耗?当异步到达一个程度的时候,是不是可以开服务器集群里面的异步服务器专门来做这个事??

Laravel --Jobs (同步\异步)消息队列 Queue --晋升篇

希望我的博客对你们有所帮助,你的认可就是我最大的动力。。

  https://www.blog8090.com/

本文为作者原创,允许转载,转载后请以链接形式说明文章出处. 如转载但不标明来源,后果自负。


推荐阅读
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 当PHP中的tempnam()函数被禁用后的应对策略与解决方案
    当 PHP 中的 `tempnam()` 函数被禁用时,开发者需要采取相应的替代方案以确保应用程序的正常运行。本文探讨了多种应对策略,包括使用 `sys_get_temp_dir()` 结合自定义文件命名方法,以及利用第三方库来生成临时文件。此外,还详细介绍了如何在不同操作系统和服务器环境中配置临时文件路径,以提高代码的兼容性和安全性。 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文将深入解析 Lumen 框架中的中间件机制,并提供实用的应用指南。我们将从官方文档出发,重点解读 5.3 版本中的相关内容,帮助开发者更好地理解和使用中间件功能。通过具体示例,探讨中间件在请求处理流程中的作用及其配置方法。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • 为开发者提供了一系列实用的参考网站和资源链接,包括HTML速查手册( 和 ),帮助开发者快速查找和学习相关技术知识。此外,还涵盖了其他重要的开发工具和文档,为编程工作提供全面支持。 ... [详细]
  • 阿里云MySQL与Oracle数据库的主从复制技术详解 ... [详细]
  • 在Java分层设计模式中,典型的三层架构(3-tier application)将业务应用细分为表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。这种分层结构不仅有助于提高代码的可维护性和可扩展性,还能有效分离关注点,使各层职责更加明确。通过合理的设计和实现,三层架构能够显著提升系统的整体性能和稳定性。 ... [详细]
  • 在本文中,我们将为 HelloWorld 项目添加视图组件,以确保控制器返回的视图路径能够正确映射到指定页面。这一步骤将为后续的测试和开发奠定基础。首先,我们将介绍如何配置视图解析器,以便 SpringMVC 能够识别并渲染相应的视图文件。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
author-avatar
志强旻茜青民
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有