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

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

The API I'm using has a limit of 40 requests every 10 seconds. I am caching things, so it would be very rare to hit this limit, but I'd like to know that my application wouldn't just die if it did!

Some notes about my app:

  • 只有在过go 6小时内未进行相同的调用时,才会进行API调用.如果有,则永远不会进行呼叫,并直接从我的redis缓存提供响应.
  • 在大多数情况下,API调用是通过用户操作进行的.应用程序本身永远不会接近这些极限.
  • 在大多数情况下,我已经拥有向用户显示请求页面所需的数据.可以在后台进行API调用,查看是否需要更新任何内容,但如果我已经拥有数据,并且API请求失败,这不会使页面变得无用.
  • The app is live, https://likethis.tv if you'd like to look. I'm using TMDb API.

So, my question is, how should I make sure I do not hit this limit? A few ideas of mine are the following:

  • 使用Laravel排队系统将大量的请求放入一个队列中,并且仅当我们仍有请求时才处理它们.如果没有,等待10秒的冷却时间结束...
  • Use a HandlerStack for Guzzle directly. Not sure if this is possible, but I've used the HandlerStack for caching responses before.

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

Thanks in advance.

推荐答案

  1. Wrap your API calls with Jobs and push them to separate queue:

    ApiJob::dispatch()->onQueue('api');
    
  2. Use mxl/laravel-queue-rate-limit package (I'm the author) to rate limit api queue. Add this to config/queue.php:

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

    $ php artisan queue:work --queue api
    

另见第this answer页.

Laravel相关问答推荐

try 编写一个函数,如果产品存在,则无法删除特定类别

CKEditor在laravel中的p标记之前和之后添加额外的p标记

查询Laravel中的图形

vagrant会损坏你的电脑. | macOS v12(蒙特雷)#13132

如何在 Laravel Eloquent Collection 数组之前添加一个键值对?

Laravel 5.1 - 如何在进度条上设置消息

Laravel 控制器中一种特定方法的中间件

Laravel 5 - 手动分页

Laravel 生产问题 - 使用 Laravel 4.1.x 更新composer

使用限制排队 Guzzle 请求

在 Laravel 5.4 中将中间件应用于除 `setup/*` 之外的所有路由

如何访问 Carbon 对象类型?

调用未定义的方法 Illuminate\Foundation\Application::bindShared()

Laravel 全部返回 ID 变为 0

Laravel 4 上传图片表单

改变模式生成器中的列长度?

Laravel 在保存前生成 slug

在 laravel 的自定义路径中创建模型

无法在控制器的构造函数上调用 Auth::user()

Laravel 将附加参数传递给函数