您现在的位置是:首页 > 正文

Laravel - 队列应用及踩过的坑

2024-01-30 20:14:29阅读 0

Laravel 自己实现了队列的机制,如果要看源码解析,这两篇文章写的很好。

  • https://laravel-china.org/articles/4169/analysis-of-laravel-message-queue
  • https://laravel-china.org/articles/7037/laravel-queue-analysis-of-message-queue-tasks-and-distribution-source-code
    注:第二篇文章因为七牛存储不再提供域名服务的原因,导致图片无法访问,我把珍藏的截图贡献出来。
    在这里插入图片描述

本篇要讲的是在应用中遇到的坑。

Laravel 常用的队列驱动
  • Redis
  • beanstalk
  • sqs
  • database
在MySQL事务中

队列一般用于比较耗时或不太重要的任务处理,如果是不太重要的任务(比如:发邮件、发消息),那就没必要在事务中进行写队列的操作,即使写入队列不成功也没什么大不了的。
但是如果是比较重要但耗时的任务,为了能快速响应用户,需要用到队列。因为任务是比较重要,所以需要保证数据入库写入队列都成功。这种情况下就有一个很重要的点,业务代码需要先写数据库后再写入队列,因为MySQL事务回滚并不会回滚队列

队列的异常、错误

无论选择哪一种队列驱动,Laravel 都会把错误的任务写入failed_jobs表中(当然,如果你设置了重试次数,那就是重试之后仍然失败后写入)。

  • 当代码异常情况下,如果捕捉就不会写入failed_jobs表中。
  • 当代码错误情况下,就一定会写入(除非mysql写入失败)。
单个任务执行时间
'redis' => [
	'driver' => 'redis',
	'connection' => env('QUEUE_REDIS_CONNECTION', 'default'),
	'queue' => 'default',
	'retry_after' => 60
]

queue.php 文件配置中(以redis 为例),retry_after代表如果单个任务在60秒内没有ack,就会把任务重新放入队列。简单的讲:如果单个任务执行时间超过60秒,就会重复执行。

数据库驱动

如果用 DB 作为驱动,队列定时回去数据库查询需要执行的任务,

select * from `nw_jobs` where `queue` = default and ((`reserved_at` is null and `available_at` <= 1548066079) or (`reserved_at` <= 1548062479)) order by `id` asc limit 1 for update

这条 SQL 会用到主键索引,所以只会锁单条记录。

其他
  • 我们为什么要使用队列,有两个比较重要的原因:异步和重试
  • 由队列就可以联想到消息服务,消息服务就需要满足以下功能
    • 消费者回调
    • 重发机制
    • 消息幂等性

网站文章

  • Centos7安装Redis单节点

    Centos7安装Redis单节点

    Centos7安装Redis单节点下载Redis安装包服务器中使用wget直接下载解压安装gcc依赖编译&安装修改默认配置文件启动Redis连接客户端停止Redis下载Redis安装包Redis官网地址:https://redis.io/这里下载最新的5.0.5版本。下载地址:服务器中使用wget直接下载服务器需要能够访问外网,可以参考VirtualBox配置Centos7固定...

    2024-01-30 20:14:23
  • 计算机中丢失mplugin.dll,安装MathType时提示缺少Mplugin.dll文件

    计算机中丢失mplugin.dll,安装MathType时提示缺少Mplugin.dll文件

    MathType在编辑数学公式确实很方便,因为它的功能很强大,能够进行多种数学符号编辑。但是MathType在使用安装时也有很多朋友遇到了很多问题,比如Mplugin.dll文件缺失,这样就导致了Ma...

    2024-01-30 20:14:16
  • Python基础学习:逻辑回归理论(第一天)

    Python基础学习:逻辑回归理论(第一天)

    Python基础学习:逻辑回归理论(第一天)1文章内容Python基础学习:逻辑回归理论(第一天)[^1]1.逻辑回归理论简介2.逻辑回归应用2.1 简单示例2.1.1 导入库函数2.1.2 创建实例...

    2024-01-30 20:13:46
  • Python基础专栏11-python基础篇-复合数据类型-集合

    Python基础专栏11-python基础篇-复合数据类型-集合

    今天要讲解的内容是另外一种数据结构类型-集合,集合这个概念对于大家来说,应该不陌生;在数学当中,我们已经学过这个概念,也大概应该知道集合的作用;集合是一个存放数据的容器,并且集合当中也是可以存放任何数据类型的数据,集合的特点是无序性和唯一性,集合当中的元素是没有顺序的,不能按照索引位置进行元素访问,唯一性是指集合当中的元素是不重复的。这一点也是经常被用作数据去重。...

    2024-01-30 20:13:39
  • HTML实体编码、URL编码、正则表达式、状态码总结

    编码是指将数字和字符通过一定的转换后使其能够在计算机中进行展示的行为,因为计算机只能识别0,1的信号,所以输入计算机中的信息都要转换成0,1串的形式才能被计算机识别。在计算机中,编码的本质是用来保存或...

    2024-01-30 20:13:32
  • 超燃!高效 MacBook 工作环境配置,超实用!

    超燃!高效 MacBook 工作环境配置,超实用!

    关注“Java后端技术全栈”回复“面试”获取最新资料回复“加群”邀您进技术交流群工欲善其事,必先利其器,工具永远都是用来解决问题的,没必要为了工具而工具,一切工具都是为了能快速准确的完成...

    2024-01-30 20:13:04
  • 做了3年Java的朋友跳槽天猫,拿下offer(面经总结)

    做了3年Java的朋友跳槽天猫,拿下offer(面经总结)

    很多人去面试之前都很做足准备,下面就分享一次,从面试中,其实可以看得出来现在的公司对于面试者的知识体系要求,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。 天猫一面: 第一步先自我介绍? 介绍自己...

    2024-01-30 20:12:56
  • 网站打开速度缓慢的原因都有哪些?

    网站打开速度缓慢的原因都有哪些?

    网站打开速度缓慢的原因都有哪些?

    2024-01-30 20:12:48
  • css修改滚动条样式(兼容火狐)

    css修改滚动条样式(兼容火狐)

    css修改滚动条样式(兼容火狐)

    2024-01-30 20:12:40
  • idea调试之条件断点

    idea调试之条件断点

    开发中有时会出现这样的场景,在一个很长的for循环中,我们只想在某一次循环中(比如第50次循环,或者循环中某个值符合条件)让断点停住,进行进一步的调试分析,此时使用idea的条件断点就能很方便的解决问题。举例如下:package demo;public class ConditionalBreakPointDemo { public static void main(S...

    2024-01-30 20:12:11