【发布时间】:2017-10-20 21:27:12
【问题描述】:
我正在使用 Guzzle 6 开发一个 Laravel 应用程序。很多功能都依赖于一个 API,我已经为其创建了一个包装器。
我的包装器是一个单独的类,它在 __construct() 中创建 Guzzle 客户端,并具有各种从 Guzzle 请求返回响应的公共函数。
我使用的 API 每 10 秒有 40 个请求的限制。我正在缓存东西,所以很少会达到这个限制,但我想知道我的应用程序不会死!
关于我的应用的一些说明:
- 仅在过去 6 小时内未进行相同调用时才进行 API 调用。如果有,则永远不会进行调用,并且直接从我的 redis 缓存中提供响应。
- 在大多数情况下,API 调用是通过用户操作进行的。应用程序本身永远不会接近这些限制。
- 在大多数情况下,我已经拥有向用户显示请求页面所需的数据。可能会在后台进行 API 调用以查看我是否需要更新任何内容,但如果我已经拥有数据,并且 API 请求失败,这不会使页面变得无用。
- 该应用程序已上线,https://likethis.tv 如果您想查看。我正在使用TMDb API。
所以,我的问题是,我应该如何确保我没有达到这个限制?我的一些想法如下:
- 使用 Laravel 队列系统将 Guzzle 请求放入队列中,并且仅在仍有请求时才处理它们。如果没有,请等到 10 秒的冷却时间过去...
- 直接使用
HandlerStack表示 Guzzle。不确定这是否可行,但我之前使用过HandlerStack来缓存响应。
我尽量不引起过于自以为是的回应,但我确信可能有比上述更好和/或更简单的方法,或者如果它们是好主意,任何指针或建议都会很棒。
提前致谢。
【问题讨论】:
-
为此添加了赏金。我也想知道如何有效地限制我自己对 API 的调用,我也在考虑使用队列,但无法找到正确的方法。
-
应该将api的响应传递到数据库中还是应该显示给客户端?第二种情况看起来很困难。
-
API 调用的顺序在某种程度上是否相关?
-
响应用于更新/创建数据库中的记录。顺序并不重要。目前我的包装器只处理 404,所以我想我会重做那一点,并将错误响应交给刚刚进行调用的任何内容,以便它可以决定做什么。例如,当只有 API 请求出错时,如果我的数据库中有记录,则不需要抛出错误。
标签: php laravel laravel-5 guzzle guzzle6