admin管理员组

文章数量:1640491

laravel 的schedule 是一个不错的东西,让定时任务变得更加简单,可以根据业务需求来去定时的跑脚本,但其中也有许多不够好的地方

一、任务锁机制

假设现在我们每分钟需要跑一个脚本,但是这个脚本的执行时间无法把控,有时候可能会超过一分钟,这时候如果不加任务锁,那么下个执行时间到了就会有两个脚本一起跑的情况,可能会造成数据的紊乱,比如我们每分钟刷新订单的状态,第一次跑的时候我们更新了5000个订单,但是更新到2500的时候下个脚本进来了,他会继续跑跟着一起跑后面的2500个,这可能不是我们想要的,于是laravel 提供了withoutOverlapping()的方法

$schedule->command('order:update')->withoutOverlapping();

这样定时任务就不会同时在跑了,不过这可能会衍生另外的问题,如果我们跑脚本的时候发生了异常,比如请求第三方接口导致代码报错,或者一些其他因素导致代码异常了,那么这个锁就不会释放,laravel会认为这个任务还没有结束,导致这个定时任务不会跑,我的解决方法就是,自己用redis加锁,并且在任务结束的时候释放这个锁,

二、线性执行的问题

如果我们有很多laravel的定时任务,有A,B,C,D四个任务,如果在A任务执行的过程中发生异常,报错了,而我们又没有处理好,那么BCD任务就不会执行了。或者我们的代码是优秀的,处理了各种异常的状态,但是A任务跑的时候用了太长时间了,一分钟的任务跑了足足有10分钟,这也同样会导致BCD的任务会延迟10分钟后才执行,尽管我们加了任务锁,但是也可能会对业务造成影响。

总结

一些小的任务可以放到laravel的定时任务去执行,一些大的任务,比较重要的任务,如数据统计,数据分析等任务就不要用了,直接用linux的crontab来代替这个东西,让这些任务独自在某个角落里慢慢执行;定时任务需要注意并发是否会对业务造成影响,如果会,需要加锁

本文标签: 弊端Laravelschedule