我正在使用 Guzzle 6 开发 Laravel 应用程序。很多功能都依赖于 API,我已经为其创建了一个包装器。
我的包装器是一个单独的类,它在 __construct()
中创建 Guzzle 客户端,并具有各种返回 Guzzle 请求响应的公共(public)函数。
我使用的 API 限制为每 10 秒 40 个请求。我正在缓存东西,所以很少会达到这个限制,但我想知道如果达到了我的应用程序不会死掉!
关于我的应用的一些说明:
- 只有在过去 6 小时内没有进行过相同的调用时,才会进行 API 调用。如果有,则永远不会进行调用,直接从我的 Redis 缓存提供响应。
- 在大多数情况下,API 调用是通过用户操作进行的。应用程序本身永远不会接近达到这些限制。
- 在大多数情况下,我已经拥有向用户显示请求页面所需的数据。可能会在后台执行 API 调用以查看我这边是否需要更新任何内容,但如果我已经拥有数据并且 API 请求失败,这不会使页面变得无用。
- 应用已上线,https://likethis.tv如果你想看的话。我正在使用 TMDb API。
那么,我的问题是,我应该如何确保没有达到此限制?我的一些想法如下:
- 使用 Laravel 队列系统将 Guzzle 请求放入队列中,并且仅在我们仍有请求时才处理它们。如果没有,请等到 10 秒冷却时间过去...
- 直接为 Guzzle 使用
HandlerStack
。不确定这是否可行,但我之前使用过HandlerStack
来缓存响应。
我尽量不引起过于自以为是的回应,但我确信可能有比上述方法更好和/或更简单的方法,或者如果它们是好主意,任何指示或建议都会很棒。
提前致谢。
最佳答案
使用 Jobs 包装您的 API 调用并将它们推送到单独的队列:
ApiJob::dispatch()->onQueue('api');
使用 mxl/laravel-queue-rate-limit包(我是作者)到速率限制
api
队列。将此添加到config/queue.php
:'rateLimit' => [ 'api' => [ 'allows' => 40, 'every' => 10 ] ]
运行队列 worker :
$ php artisan queue:work --queue api
另见 this answer .
关于php - 有限制地排队 Guzzle 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44092240/