手机版

使用消息队列时Laravel应该注意的几个问题

时间:2021-09-02 来源:互联网 编辑:宝哥软件园 浏览:

消息队列是大型Web项目不可缺少的模块,可以解决大并发和多语言通信接口的问题。对于大并发的问题,可以将耗时的任务或不能同时并行的任务封装并发送到消息队列中,处理器可以不断从消息队列中提取消息并进行处理。这样,在大并发的情况下,消息队列的缓冲区可以停止阻塞。如果性能不够,还可以添加多个处理任务,从消息队列中获取消息进行处理。比如在数据库的操作中,当读写数据库的操作太多时,就会出现锁表等问题。读的问题可以通过缓存来解决,写的问题需要通过消息队列来解决。而且在大型Web项目的开发中,很多情况下不可能用一种语言实现,需要充分发挥不同语言的优势,比如PHP。虽然理论上它可以做Web开发中的所有事情,但是用它来解决一些问题,比如实时套接字连接和分布式事务处理,效率会非常低。

使用Laravel的消息队列处理异步任务,Redis作为队列数据库,Supervisor监控脚本异常中断并自动重启,这是Laravel处理队列任务的标准流程。然而,在实践中可能会出现各种问题。为了保证系统的可靠性,需要注意几个问题。

一、执行失败重试次数的设置

请确保设置任务执行的失败重试次数,以避免无限次失败重试。默认情况下,如果Laravel超过重试次数,它将被写入失败的任务表,或者它可以为失败的执行编写自己的后续处理逻辑。

PHP artisan queue : workredis-tries=3需要先执行以下命令来创建一个数据表:

PHP artisan队列:失败-表PHP artisan迁移二。程序异常的处理

程序执行过程中有时会出现异常,比如依赖其他接口,请求HTTP接口超时等。如果没有捕获到异常,当前队列将被中断,无法继续运行。比如将内容推送给一万个用户,需要依靠界面推送,如果中间请求挂起,会影响后续推送。

这里的异常指的是程序执行过程中发生的异常,而不是常驻进程挂起。程序异常不一定会导致常驻进程中断。此外,过程中断由主管监控和重启。

例如捕获异常代码片段:

尝试{ $r=$client-request('POST ','',[' query '=[' client _ name '=' file mail ',' client_version'='1.0 ',' client_sequence'=0,' uid'=692934013,//119481237 'r'=1508312484,],' body '=\ guzzhettp \ JSON _ encode($ body),]);$ result=$ r-GetBody()-GetContents();$result=json_decode($result,true);if($ result[' result ']==0){ info(' SendMail fail : '。JSON _ encode($ result));$this-pushLog($task['id'],$task['mail_id'],内爆(',',$userIds),json_encode($result),0);} else { log : warning(' sendMail fail : '。JSON _ encode($ result));$this-pushLog($task['id'],$task['mail_id'],内爆(',',$userIds),json_encode($result),$ result[' result ']);} } catch(request exception $ e){ log : warning(' request exception ')。$ e-Getmessage());}捕获(异常$e) {日志:紧急情况('异常')。$ e-Getmessage());}第三,修改代码,记得重启Supervisor

最后,处理队列的程序已经修改。请记住重新启动Supervisor,否则脚本将不会生效。

Laravel写队列到Redis的数据结构

队列以列表类型存储,如图所示:

价值内容如下:

{“作业”:“照明\\队列\\[emailprotected]”、“数据”: {“command name”:“App \ \ Jobs \ \ send file”、“命令”:“O:17:”App \ \ Jobs \ \ send file“:53:”\ { s 33602333: \ ' \ u 0000 App \ \ Jobs \ \ send file \ u 0000 task \ ';a :8: { s :5: ' title \ ';s:4: \ ' 1111 \s:4: '注意\ ';s:2: \ ' 11 \s:6: '奖励\ ';s:0: \ ' \s:7: \ ' mail _ id \s:5: \ ' 66681 \s:4: \ ' nums \i:20s:8: \ ' uid _ file \s 336033: ' uid file \/file-66681-1513058185 . txt \ ';s:5: \ ' gcids \s 336040: ' 1b 9dd 95645 aae 8119 F7 da 9 b 9 ff 738d 52 bc8 a1 BD 5 \ ';s:2: \ ' id \i:29} s :6: \ ' \ u 0000 * \ u 0000 job \ ';n;s:10: '连接\ ';n;s:5: '队列\ ';s:8: \ ' sendfile \s:5: '延迟\ ';n;}'},' id ' : ' l0mjsuthbxm4 tgijnuh 13 km9n 8 diperk ','尝试' : 1}包含失败重试的次数、队列标识、处理队列的类以及队列数据等。

参考链接

Laravel官方文档队列队列:

https://laravel.com/docs/5.5/queues

摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。

版权声明:使用消息队列时Laravel应该注意的几个问题是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。