Laravel自定义Rate Limiter如何设置任务释放延迟时间?
Laravel队列限流自定义释放时间方案
方法一:自定义RateLimitedWithRedis中间件
Laravel默认的RateLimitedWithRedis中间件触发限流时,任务会被快速放回队列。你可以通过继承并重写该中间件,自定义释放延迟:
- 创建自定义中间件:
<?php namespace App\Queue\Middleware; use Illuminate\Queue\Middleware\RateLimitedWithRedis as BaseRateLimitedWithRedis; class RateLimitedWithRedis extends BaseRateLimitedWithRedis { /** * 设置任务被限流后的释放延迟(秒) * * @return int */ protected function delay() { return 5; // 改为你需要的5秒延迟 } }
- 在Job中替换为自定义中间件:
// Job类中 public function middleware(): array { return [ new \App\Queue\Middleware\RateLimitedWithRedis('google-sheets') ]; }
方法二:通过RateLimiter的then方法自定义逻辑
也可以在定义限流规则时,直接指定触发限流后的处理逻辑,手动设置释放延迟:
// AppServiceProvider中 RateLimiter::for('google-sheets', function (object $job) { return Limit::perMinute(20)->then(function () use ($job) { $job->release(5); // 释放5秒后重试 return false; }); });
两种方式都能实现限流时任务延迟5秒再重试,避免短时间内大量任务频繁入队出队导致的RDS IOPS过载问题。
内容的提问来源于stack exchange,提问作者Adam Lambert
相关产品推荐
相关产品推荐

