Дросселировать многопользовательские запросы на внешний сайт PHP? - PullRequest
0 голосов
/ 22 марта 2012

В настоящее время у меня есть скрипт, который частично отправляет запросы на внешний сайт. Внешний сайт имеет простой предел API 50 на 30 секунд для использования API, и если он отправляет запрос определенного типа на основной сайт (как мой сценарий сделает), это 3 в минуту. Теперь это легко решить для одного пользователя с помощью сценария. Однако несколько пользователей будут использовать сценарий одновременно, и если достаточное количество пользователей будет использовать его одновременно, ограничение будет превышено. Я пытаюсь ограничить многопользовательские запросы, чтобы сервер не отправлял больше лимита, хотя каждый пользователь этого не делает. Я пытаюсь найти способ сделать это. Обеспечение того, чтобы сервер никогда не отправлял слишком много запросов на внешний сайт. Есть ли способ сделать это?

1 Ответ

0 голосов
/ 13 июля 2015

Используйте алгоритм корзины токенов с общим хранилищем для ограничения скорости. Я реализовал один для вас: bandwidth-throttle / token-bucket

Этот пример ограничит скорость для всех пользователей до 50 запросов в 30 секунд (т.е. 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();
}
...