1

我正在使用 tmdb API,它对请求有一个新的限制,即每个 IP 在 10 秒内有 30 个请求。我可以通过在 MySQL 中保存每最后 10 秒的请求数量的表来跟踪这些调用,但是如何使用不同的 IP 地址来完成此操作?

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

  1. 从桌面应用程序向应用程序服务器发出请求。服务器端 php 然后进行搜索并返回数据。

  2. 然后桌面应用程序对应用程序服务器进行不同的调用,然后依次对 tmdb (4-7) 和其他 api 进行几次 api 调用。

在某些情况下,可以有从几个搜索请求到几千个的任何地方。跟踪和延迟 api 调用以使其低于限制的最佳方法是什么?

4

3 回答 3

2

如果您的服务器正在向具有速率限制的另一台服务器发送请求,则无论哪个客户端正在向您的服务器发出请求等,您都需要一种全局方式来跟踪来自您的服务器的请求。

我会使用一个平面文件,并为每个请求保存 unix 时间和一个分隔符,如果文件包含其中的十个,你已经完成了十个请求,你需要清理文件并删除任何较旧的时间戳不到十秒,这将为您提供最简单的 PHP 速率限制器形式。

当然有更高级的方法,但我会从那里开始,并确保你测试它,这样你就不会失去你的 API 访问等。

于 2012-11-05T17:52:00.743 回答
1

您可以使用 php sleep 功能来限制您发出请求的速率。或者确实使用类似 usleep 功能的东西通过给出你想要延迟的微秒数来停止。

于 2012-11-05T17:34:32.730 回答
0

令牌桶算法可以做限速。我为你做了一个带有共享存储的线程安全实现:bandwidth-throttle/token-bucket

此示例将应用程序限制为每秒 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();
于 2015-07-12T19:11:21.643 回答