为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel Redis 队列忽略限制

Laravel Redis 队列忽略限制

PHP
梵蒂冈之花 2023-07-01 16:42:10
我正在使用 Laravel Horizon 和 Redis,我正在尝试限制它。我使用的外部 API 的速率限制为每分钟 100 个请求。我需要提出大约 700 个请求。我进行了设置,以便添加到队列中的每个作业仅在作业本身中执行一个 API 调用。因此,如果我限制队列,我应该能够保持在限制范围内。由于某种原因,没有发生限制,而是超出了队列(当然,这会触发许多 API 错误)。然而,节流阀在本地工作,但不在我的服务器上工作。我最初试图根据 Laravel 的队列文档进行限制,但只能让它在本地工作,所以我转而尝试Github 上的laravel-queue-rate-limit包。根据自述文件,我将以下内容添加到我的queue.php配置文件中:'rateLimits' => [        'default' => [ // queue name            'allows' => 75, // 75 job            'every' => 60 // per 60 seconds        ]    ],     由于某种原因,当我在本地 Ubuntu 环境中运行它时,限制可以正常工作,但它在我的服务器(也是 Ubuntu)上不起作用。在服务器上,它只是吹过队列,就好像没有适当的节流一样。我是否做错了什么,或者可能有更好的方法来处理速率受限的外部 API?
查看完整描述

1 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

看来您提到的软件包(laravel-queue-rate-limit)与 Horizon不能很好地配合。使用 Laravel 的内置方法可能会更好。
在 Laravel 的队列中,添加->block(60)匹配->every(60),以便默认超时不会启动并在 60 秒之前调用另一个回调。

Redis::throttle('torn-api')->allow(75)->every(60)->block(60)

另外,请考虑向 Horizon 的 config 添加超时和最大重试值(config/horizon.php)failed您还可以使用作业本身中的方法记录任何异常。

Horizon 配置中的设置retry_after和值。timeoutretry_after在配置中的价值应始终大于完成工作所需的时间。并且该timeout值应该比该值短几秒retry_after。“这将确保处理给定作业的工作人员始终在重试作业之前被杀死。” 


查看完整回答
反对 回复 2023-07-01
  • 1 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信