华为云云耀云服务器L实例评测|企业项目最佳实践之计划任务与Queue队列实践 (十)

十一、计划任务与Queue队列实践:

1. 计划任务:

Linux环境下定时或者周期性的执行一些任务通常由cron这个守护进程来完成,这是一个系统自带的相对也比较方便的系统工具。

js 复制代码
sudo apt-get install cron  // 默认自带

目录结构:

目录 说明
/var/spool/cron/crontabs 用户调度任务目录,是每个用户包括root的crontab任务,每个任务以创建者的名字命名,比如用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。
/etc/crontab 系统调度任务,主要负责调度各种管理和维护任务,比如写缓存数据到硬盘、日志清理等。
/etc/cron.d/ 用来存放任何要执行的crontab文件或脚本。

可以看到当配置完crontab后,就可以看到触发了发送短信的定时任务Schedule,可如下为打印出来的日志,当然,改造的代码只是做了日志的输出,并没有真实去发送短信。


2. 消息队列场景:

我们在开发应用过程中难免会遇到处理耗时任务的需求,这些任务如果直接在用户的请求中处理,必然会导致页面显示被阻塞,可以将任务交给异步队列来处理更为方便。

创建需要存储任务的数据库表。

js 复制代码
# 使用 database 队列驱动,需要创建一个数据表来存储任务
php artisan queue:table
# 创建一个数据表来存储队列中的任务会失败
php artisan queue:failed-table
# 使用 migrate 这条命令来创建数据表
php artisan migrate

同时,可以看到执行migrate后,会同步生成2张表,为分别jobs(记录所有消息队列的数据)、failed_jobs(记录消费失败多少次后的数据)。

生成一个新的队列任务,这里我们模拟给某个用户发送邮件功能,当用户请求统计的路由时,会产生一个队列的待消费数据,可以在jobs表中查看到,当手动queue:listen命令执行监听时,就会触发队列中的任务进行消费,模拟打印一条日志。

js 复制代码
# 运行 make:job Artisan 命令自动创建一个新的队列任务
php artisan make:job SendEmail
# 先手动执行监听,模拟当产生数据时,就会触发队列中的任务进行消费
php artisan queue:listen --tries=3 --timeout=30

开启监听后,得到的日志:


以上,整个手动监听队列就完成了,实际上,工作的场景是在服务器上后台运行,这里需要Supervisor来进行后台监听。

js 复制代码
apt-get install supervisor

配置文件路径在/ /etc/supervisor/conf.d/sendMail.conf内容:

js 复制代码
[program:laravel-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /workspace/clang-quickstart/map-api/artisan queue:work --daemon --sleep=3 --tries=3       # 命令
autostart=true
autorestart=true
directory=/workspace/clang-quickstart/map-api           # 进程的当前目录
user=www-data                        # 进程运行的用户身份
numprocs=1                           # 启动多少个进程来监听Laravel队列
redirect_stderr=true

3. 小结:

laravel中的队列服务跟其他队列服务也没有什么不同,有一个地方存放队列信息,一个PHP进程在运行时将任务写入,另外一个PHP守护进程轮询队列信息,将达到执行要求的任务执行并删除,laravel提供一个守护进程工具来查询并执行队列信息。

相关推荐
Acrelhuang17 分钟前
安科瑞5G基站直流叠光监控系统-安科瑞黄安南
大数据·数据库·数据仓库·物联网
wowocpp24 分钟前
ubuntu 22.04 硬件配置 查看 显卡
linux·运维·ubuntu
萨格拉斯救世主1 小时前
jenkins使用slave节点进行node打包报错问题处理
运维·jenkins
川石课堂软件测试1 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
十叶知秋1 小时前
【jmeter】jmeter的线程组功能的详细介绍
数据库·jmeter·性能测试
龙哥说跨境1 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
pk_xz1234563 小时前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器
小珑也要变强3 小时前
Linux之sed命令详解
linux·运维·服务器
瓜牛_gn3 小时前
mysql特性
数据库·mysql
海绵波波1073 小时前
Webserver(4.3)TCP通信实现
服务器·网络·tcp/ip