排队有限制的咕噜咕噜请求

2022-08-30 23:45:12

我正在开发一个Laravel应用程序,使用Guzzle 6。许多功能依赖于API,我已经为API创建了一个包装器。

我的包装器是一个类,它在 中创建 Guzzle 客户端,并具有各种公共函数,这些函数返回来自 Guzzle 请求的响应。__construct()

我使用的 API 限制为每 10 秒 40 个请求。我正在缓存东西,所以达到这个限制是非常罕见的,但我想知道我的应用程序不会死掉, 如果它这样做!

关于我的应用的一些说明:

  • 仅当过去 6 小时内未进行相同调用时,才会进行 API 调用。如果有,则永远不会进行调用,并且直接从我的 redis 缓存提供响应。
  • 在大多数情况下,API 调用是通过用户操作进行的。应用程序本身永远不会接近达到这些限制。
  • 在大多数情况下,我已经拥有向用户显示请求的页面所需的数据。可以在后台执行 API 调用,以查看是否有任何内容需要更新,但是如果我已经拥有数据,并且 API 请求失败,这不会使页面无用。
  • 该应用程序是实时的,如果您想查看,https://likethis.tv。我正在使用 TMDb API。

所以,我的问题是,我应该如何确保我没有达到这个限制?我的一些想法如下:

  • 使用 Laravel 队列系统将 Guzzle 请求放入队列中,并且仅在我们仍有请求时处理它们。如果没有,请等到10秒冷却时间过去...
  • 直接将 a 用于 Guzzle。不确定这是否可能,但我之前使用过 用于缓存响应。HandlerStackHandlerStack

我试图不引起过于固执己见的回应,但我相信可能有比上述更好和/或更简单的方法,或者如果它们是好主意,任何指针或建议都会很棒。

提前致谢。


答案 1
  1. 使用作业包装 API 调用并将它们推送到单独的队列:

    ApiJob::dispatch()->onQueue('api');
    
  2. 使用 mxl/laravel-queue-rate-limit package(我是作者)来对队列进行速率限制。将其添加到:apiconfig/queue.php

    'rateLimit' => [
        'api' => [
            'allows' => 40,
            'every' => 10
        ]
    ]
    
  3. 运行队列工作线程:

    $ php artisan queue:work --queue api
    

另请参阅此答案


答案 2

没有足够的信息来真正深入研究这个问题,但是为了让你入门,当你超过其限制时,好的API通常会返回429响应代码。

您可以使用 from guzzle 来检查这一点,并在用户发出太多请求太快时向用户闪回一条消息。$res->getStatusCode()

你能提供更多关于你的应用正在做什么的信息吗?您是否在前循环中发出请求?视图是否依赖于此 API 中的数据?


推荐