阅读(935)
赞(9)
Laravel 8 速率限制
2021-07-06 09:25:04 更新
注意:该特性要求你的应用程序可以与 Redis 服务器 交互。
如果你的应用程序与 Redis 交互,你可能会根据时间或并发性限制排队任务。当排队的任务与同样有速率限制的 api 交互时,此特性可以派上用场。
例如,使用 throttle
方法,您可以将给定类型的作业限制为每 60 秒只运行 10 次。如果无法获得锁,通常应将任务释放回队列,以便稍后重试:
Redis::throttle('key')->allow(10)->every(60)->then(function () {
// 任务逻辑...
}, function () {
// 无法获得锁...
return $this->release(10);
});
技巧:在上面的示例中,
key
可以是唯一标识你希望对其进行速率限制的任务类型的任何字符串。例如,你可能希望基于任务的类名和它所操作的 Eloquent 模型的 id 来构造密钥。
注意: 将一个已被限流的任务释放回队列仍然会增加该任务的
attempts
的总数。
或者,你可以指定可以同时处理给定任务的 worker 的最大数量。当队列作业正在修改一个每次只能修改一个任务的资源时,这是很有用的。例如,使用 funnel 方法,你可以限制一个给定类型的任务一次只能由一个 worker 处理:
Redis::funnel('key')->limit(1)->then(function () {
// 任务逻辑...
}, function () {
// 无法获得锁...
return $this->release(10);
});
技巧:在使用速率限制时,很难确定任务成功运行所需的尝试次数。因此,将速率限制与 基于时间的尝试 结合起来是很有用的。