如何管理要求的限制API调用(How to manage request limited API c

2019-10-17 08:35发布

我使用的是具有其上每等级:IP 10秒30周的处理请求新的限制TMDB的API。 我可以跟踪这些电话通过在MySQL的一个表,每持有最后10秒的请求量,但我怎么能做到这一点与不同的IP地址?

我的应用程序的工作方式是:

  1. 请求从一个桌面应用程序的应用服务器进行。 服务器端的PHP然后进行搜索,并返回数据。

  2. 桌面应用程序,然后让不同的调用应用程序服务器,并且轮流做几个API调用来TMDB(4-7)和其他的API。

有可能在某些情况下,一些搜索请求到几千的任何地方。 什么是跟踪和延缓API调用来保持低于限制的最佳方式?

Answer 1:

如果你的服务器发送请求到具有速率限制另一台服务器,你需要一个全球性的方法来跟踪请求从您的服务器,无论哪个客户端做的请求到服务器等。

我会用一个平面文件,并保存UNIX时间和每个请求的分隔符,如果文件中包含这些十,你已经完成了10名的请求,和你需要清理文件,并删除任何时间戳是老年人十几秒钟,而且会给你一个PHP率限制器存在的最简单形式。

当然也有更先进的方式,但我会从那里开始,并确保您测试它,这样你就不会失去你的API访问权限等。



Answer 2:

您可以使用PHP睡眠功能,以限制你提出请求的速率。 或者甚至使用类似usleep功能通过给出的要延迟微秒数,使停了下来。



Answer 3:

该令牌桶算法可以做速率限制。 我与你共享的存储一个线程执行: 带宽节流/令牌桶

这个例子将油门应用到每秒3所请求的全球消费率:

use bandwidthThrottle\tokenBucket\Rate;
use bandwidthThrottle\tokenBucket\TokenBucket;
use bandwidthThrottle\tokenBucket\BlockingConsumer;
use bandwidthThrottle\tokenBucket\storage\PDOStorage;

$storage  = new PDOStorate("tmdb", $pdo);
$rate     = new Rate(3, Rate::SECOND);
$bucket   = new TokenBucket(30, $rate, $storage);
$consumer = new BlockingConsumer($bucket);
$bucket->bootstrap(30);

$consumer->consume(1);
$api->foo();


文章来源: How to manage request limited API calls