• laravel withoutOverlapping导致执行脚本延迟或者失效问题


    2021年7月15日11:24:00

    当执行某个需要经常跑的 everyMinute的之后防止,一次脚本未执行完就又重新跑,导致出现超出预期的错误,或者数据错误,就会使用 withoutOverlapping来防止重复执行

    $schedule->command('NoPersonPrize')->everyMinute()->withoutOverlapping();

    但是当你有多个withoutOverlapping和多个没有使用withoutOverlapping的放在Kernel的时候,会出现一些意外,比如有些脚本没有跑,或者延迟跑,是什么原因造成的呢?

     public function withoutOverlapping($expiresAt = 1440)
        {
            $this->withoutOverlapping = true;
    
            $this->expiresAt = $expiresAt;
    
            return $this->then(function () {
                $this->mutex->forget($this);
            })->skip(function () {
                return $this->mutex->exists($this);
            });
        }
    withoutOverlapping的底层是利用缓存指定一个互斥的锁,如果你的laravel的缓存使用redis的时候,就会使用redis作为互斥锁的缓存key,默认缓存是file

    $schedule->command('a')->everyMinute()->withoutOverlapping();
    
    $schedule->command('b')->everyMinute();
    
    $schedule->command('c')->everyMinute();
    
    $schedule->command('d')->everyMinute()->withoutOverlapping();

    这里多数人认为a,b,c,d会在每分钟开始会同事执行,其实不是,是先执行a,|(b,c)|d,是在a执行完在执行d,(b,c)是和a基本同时执行,

    问题在于在互斥锁的问题,是执行一个完成之后在执行一个,不是每个脚本独立执行的

    举例:

    laravel_cache:framework/schedule-0e06f675a49cb9a0010858533b27d6a525caea88

    内容:b:1;

    就会导致延迟执行某些脚本,甚至不执行
    使用建议如下:
    1,没有使用withoutOverlapping,在使用的上面,隔离开例如
    $schedule->command('b')->everyMinute();
    $schedule->command('c')->everyMinute();
    #-------------------------------------------------------------------------
    $schedule->command('a')->everyMinute()->withoutOverlapping();
    $schedule->command('d')->everyMinute()->withoutOverlapping();

    2,如果非必要每分钟执行的脚本,不要使用everyMinute+withoutOverlapping这种组合,避免重复执行
    建立通过代码逻辑规避这个问题

    3,如果多个有withoutOverlapping或者没有withoutOverlapping可以通过->dailyAt('18:33');
    这中类似的特殊时间避开全部整点执行问题

    4,减少或者不用withoutOverlapping


    QQ群 247823727 博客文件如果不能下载请进群下载
    如果公司项目有技术瓶颈问题,如有需要,请联系我,提供技术服务 QQ: 903464207
  • 相关阅读:
    【JZOJ3852】【NOIP2014八校联考第2场第2试9.28】单词接龙(words)
    【JZOJ3853】【NOIP2014八校联考第2场第2试9.28】帮助Bsny(help)
    【JZOJ3854】【NOIP2014八校联考第2场第2试9.28】分组(group)
    【JZOJ4934】【NOIP2017GDKOI模拟1.12】a
    【JZOJ4935】【NOIP2017GDKOI模拟1.12】b
    【JZOJ4925】【GDOI2017模拟12.18】稻草人
    【JZOJ4930】【NOIP2017提高组模拟12.18】C
    【JZOJ4929】【NOIP2017提高组模拟12.18】B
    如何重新加载Spring Boot上的更改,而无需重新启动服务器?
    什么是JavaConfig及其优点?
  • 原文地址:https://www.cnblogs.com/zx-admin/p/15014944.html
Copyright © 2020-2023  润新知