php - 有限制地排队 Guzzle 请求

标签 php laravel laravel-5 guzzle guzzle6

我正在使用 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 来缓存响应。

我尽量不引起过于自以为是的回应,但我确信可能有比上述方法更好和/或更简单的方法,或者如果它们是好主意,任何指示或建议都会很棒。

提前致谢。

最佳答案

  1. 使用 Jobs 包装您的 API 调用并将它们推送到单独的队列:

    ApiJob::dispatch()->onQueue('api');
    
  2. 使用 mxl/laravel-queue-rate-limit包(我是作者)到速率限制 api 队列。将此添加到 config/queue.php:

    'rateLimit' => [
        'api' => [
            'allows' => 40,
            'every' => 10
        ]
    ]
    
  3. 运行队列 worker :

    $ php artisan queue:work --queue api
    

另见 this answer .

关于php - 有限制地排队 Guzzle 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44092240/

相关文章:

laravel - 如何使用 laravel 迁移在 mysql 8 中为 json 列设置索引

php - Laravel 在 Web 服务器的 View 中显示数据

javascript - 使用提交限制验证密码时出错

php - 将我的 Controller 移动到 laravel 5 中的子文件夹后,获取 Controller 不存在

php - 如何使用 PHP composer 提供可配置的脚本

php - 在 Laravel View 中使用 CSS?

Laravel - 如何在验证规则构造中自动注入(inject)?

php - 当字段值更改时将记录复制到另一个表

php - 在 Controller 的函数中调用时找不到 Laravel 请求

mysql - #1005 - 无法在表一对多关系上创建表