Amazon Product API error 429: как оптимизировать производительность и надежность для пакетных запросов? - PullRequest
0 голосов
/ 28 января 2020

Я получаю эту досадную ошибку 429 для слишком большого количества запросов при отправке нескольких запросов. Что еще более отвратительно, так это ограничение количества продукта до 10 на запрос, как кажется.

Итак, у меня есть код, который разбивает мой массив asin на группы по 10 и, однако, когда я задаю, разбивает его на несколько запросов. 1 секунда ожидания после запуска каждого запроса перед выполнением нового, он не работает надежно и все еще возвращает ошибку, увеличивая число до 2 se c за запрос, решает эту проблему, но делает его слишком медленным. (Поскольку обычно требуется 0,5 se c за запрос и ожидает оставшиеся 1,5 секунды.)

У Amazon нет документации о том, как именно работают эти ограничения, поэтому мы можем только догадываться.

Есть ли способ улучшить его или сделать что-то другое в очереди?

$all_posts = get_posts(array(
    'posts_per_page'   => -1
));
$serialized = serialize($all_posts);
preg_match_all ( "/]([^\]]*?)\[\/asa\]/" , $serialized , $matches);
$amazon_items=$matches[1];  //here we get an array of asins

$time_end=microtime(true);
$time_start=0;

$out=array();
for ($i=0;$i<count($amazon_items);$i+=10){
    $arr=array();
    for ($j=0;$j<10&&$i+$j<count($amazon_items);$j++){
        $arr[]=$amazon_items[$i+$j];
    }
    if ($time_end-$time_start<2) {
        echo 'sleeping '.(2-($time_end-$time_start)). 'sec; ';
        sleep (2-($time_end-$time_start));
    }
    $time_start = microtime(true);
    $list = GetItems($arr);
    $time_end = microtime(true);
    echo $time_end-$time_start.' sec, ',PHP_EOL;

    $out = array_merge($out, $list); 
}

Ответы [ 2 ]

1 голос
/ 29 января 2020

Я нашел документацию Product Advertising API 5.0 здесь . На этой странице объясняется проблема, связанная с разрешенными тарифами.

Существует разумный дневной лимит, но если при каждом посещении вашего сайта происходит несколько вызовов, вы быстро исчерпаете свою квоту или будете делать слишком частые вызовы. , Регулирование необходимо, в противном случае какой-то плохой код стороннего поставщика может сделать поставщика API.

Не зная больше о том, как вы собираетесь использовать этот API, я предлагаю вам настроить бэкэнд микросервиса, который кэширует данные. от API и имеет очередь к оригиналу. Затем вы можете запросить свой собственный API столько, сколько хотите.

0 голосов
/ 15 февраля 2020

Я думаю, что я нашел решение, кажется, что Paapi 5 особенно чувствителен к самым первым запросам # 1 и # 2. Там должна быть хорошая пауза, после которой скорость запроса может быть увеличена до номинальной 1 как таковой c.

Так что l oop должен go примерно так: 1-й запрос, сделать паузу в общей сложности 2 секунды с момента начала запроса, 2-й запрос, сделать паузу в общей сложности 1 секунду с момента начала запроса, 3-й запрос, сделать паузу на 1 секунду с момента начала запроса, 4-й запрос, .. .et c

Я подозреваю, что это может также работать с удержанием 1 целой секунды ПОСЛЕ окончания первого запроса вместо 2 секунд, прежде чем переключиться на 1 сек c общее ожидание l oop подсчитано с самого начала запросов, но мне еще предстоит попробовать это для проверки. Очевидно, что если первый запрос превышает 1 секунду и выдает ошибку, я буду знать, что это так.

Изменить: он работал в течение часа, затем перестал работать, я собираюсь изменить на 1 се c после каждого запроса просто чтобы быть уверенным. Это действительно задерживается, потому что нет никакого способа сказать, сколько именно времени он записывает на их серверной стороне, это не время начала запроса и не время окончания запроса. Кажется, что он может произвольно колебаться между двумя, и всякий раз, когда нарушается правило 1 секунда (что происходит случайным образом), он начинает выбрасывать бесчисленные 429 ошибок. Хорошо, я просто подожду 1 секунду и надеюсь, что мои запросы будут немного быстрее, чем 1 se c, что должно дать мне небольшое преимущество и надежность по сравнению с ожиданием полных 2 секунд каждый раз, как в моем первоначально опубликованном примере.

...