宝哥软件园

使用消息队列时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

摘要

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

更多资讯
游戏推荐
更多+