【问题标题】:Throttle multiple-user requests to external site PHP?限制对外部站点 PHP 的多用户请求?
【发布时间】:2012-04-06 11:55:14
【问题描述】:

我目前有一个脚本,它部分地向外部站点发送请求。外部站点对使用 API 有一个简单的 API 限制,即每 30 秒 50 个,如果它向主站点发送特定类型的请求(就像我的脚本一样),则为每分钟 3 个。现在,对于使用该脚本的一位用户来说,这很容易解决。但是,多个用户将同时使用该脚本,如果有足够多的用户同时使用它,则限制将超出。我试图限制多用户请求,以防止我的服务器发送超过限制,即使每个用户都不是。我正在想办法做到这一点。确保服务器永远不会向外部站点发送太多请求。有没有办法做到这一点?

【问题讨论】:

  • 使用一些全局同步标志,例如memcache记录或信号量:php.net/manual/en/book.sem.php
  • 将请求保存在数据库中。使用 cron 脚本在外部站点每分钟触发 3 次。
  • 或者更好的是使用真正的排队机制。

标签: php api external throttling


【解决方案1】:

token bucket algorithm 与共享存储一起使用以限制速率。我为你实现了一个:bandwidth-throttle/token-bucket

此示例将所有用户的速率限制为每 30 秒 50 个请求(即每分钟 100 个请求):

use bandwidthThrottle\tokenBucket\Rate;
use bandwidthThrottle\tokenBucket\TokenBucket;
use bandwidthThrottle\tokenBucket\storage\FileStorage;

$storage = new FileStorage(__DIR__ . "/api.bucket");
$rate    = new Rate(100, Rate::MINUTE);
$bucket  = new TokenBucket(50, $rate, $storage);
$bucket->bootstrap(50);

if (!$bucket->consume(1, $seconds)) {
    http_response_code(429);
    header(sprintf("Retry-After: %d", floor($seconds)));
    exit();
}

【讨论】:

    猜你喜欢
    • 2016-03-27
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2013-08-26
    • 2021-07-20
    • 2022-01-01
    • 2016-11-25
    • 2020-05-11
    相关资源
    最近更新 更多