当前位置: 首页 > 知识库问答 >
问题:

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

东方吕恭
2023-03-14

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

我的包装器是一个类,它在<code>__construct()。

我使用的API每10秒钟有40个请求的限制。我正在缓存东西,所以很少会达到这个极限,但是我想知道如果达到这个极限,我的应用程序不会就这么死掉!

关于我的应用程序的一些注意事项:

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

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

    < li >使用Laravel排队系统将Guzzle请求放入队列,并且仅在我们还有请求时处理它们。如果没有,请等待10秒钟的冷却时间... < li >直接使用< code>HandlerStack进行Guzzle。不确定这是否可能,但我以前使用过< code>HandlerStack来缓存响应。

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

提前致谢。

共有3个答案

商瀚
2023-03-14
匿名用户

我也在处理同样的问题,我更喜欢基于回调的架构,我的Client类控制请求流。目前我正在做睡眠和检查算法。我为我工作,因为我有3秒的冷却时间。

我使用缓存保存已触发请求的计数。

while(($count = Cache::get($this->getCacheKey(),0)) >= 40){ // Max request
    sleep(1);
}
Cache::set($this->getCacheKey(), ++$count);
// fire request

function getCacheKey(){
    return floor(time()/10); // Cool down time
}

排队似乎是一个更好的选择,我最终会转向这一点。在将队列置于两者之间之前,您需要记住几件事。

    < li >基于回调的体系结构,因为您可能需要在队列中保存代码的序列化状态。基于回调的设计将把所有控制权交给< code>Client类。您不必担心代码中的节流问题。 < li >序列化可能比较复杂,请尝试< code>__sleep和< code>__wakeup。 < li >您可能还希望对少数呼叫进行优先级排序,您可以从客户端为此类呼叫分配一个配额。

罗浩然
2023-03-14

没有足够的信息来深入研究这个问题,但是为了让您开始,当您超过它们的限制时,好的API通常会返回一个429响应代码。

你可以使用$res-

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

经景辉
2023-03-14

>

  • 用作业包装您的API调用并将它们推送到单独的队列:

    ApiJob::dispatch()->onQueue('api');
    

    使用mxl/laravel-queue-rate-limit包(我是作者)对< code>api队列进行速率限制。将它添加到< code>config/queue.php中:

    'rateLimit' => [
        'api' => [
            'allows' => 40,
            'every' => 10
        ]
    ]
    

    运行队列工作线程:

    $ php artisan queue:work --queue api
    

    另请参阅此答案。

  •  类似资料:
    • 看起来 grpc 先决条件是 java 7 或更高版本。 安装grpc时出现异常。Java . lang . unsupportedclassversionerror:com/Google/proto buf/grad le/proto buf plugin:不支持的major.minor版本51.0 我有java 6在本地运行。可能是grpc运行java 6的一种方式?

    • 我正在我的网络空间上安装Google API PHP客户端(2.1.0)并遵循本教程。问题是当我转到时,我有一个PHP错误: 致命错误:未捕获异常“GuzzleHttp\Ring\exception\ConnectException”,消息为“cURL error 6:请参阅”http://curl.haxx.se/libcurl/c/libcurl-errors.html'in/reportin

    • 我在Windows8机器上从命令行运行Grunt时出现问题。 我的研究表明,最常见的解决方案是安装grunt-cli,因为Grunt不再是全局的。我还需要确保实际安装了Grunt任务运行程序,因为它不是与grunt-cli一起安装的。 其他解决方案指向PATH系统环境变量,但它似乎与我预期的一样: null

    • 我试着向Github API发出一个API请求,只是为了测试。我在我的Laravel 5.1应用程序上安装了最新的Guzzle版本(“guzzle/guzzle”:“^3.9”)。在我的< code>routes.php中,我有以下代码: 如果我现在访问URLdomain.dev/github/kayyyy我得到错误。 为什么我会收到此错误? 如果我访问https://api.github.com

    • 因此,我在删除和安装node和npm以安装没有sudo的软件包时遇到了麻烦,现在我无法在Webstorm中使用Grunt面板 信息是: 请注意,我已经安装了。

    • 这是来自Cloudinary文档的代码, 所以我不能以这种方式将Guzzle验证设置为假 我的问题是,通常在应用程序中,如何将Guzzle Http客户端验证设置为false