Amazon Product API错误429:如何优化批量请求的性能和可靠性?

Amazon Product API error 429: how to optimize performance and reliability for batch requests?

我在发送多个请求时收到这个烦人的错误 429,原因是请求太多。更恶心的是,它似乎将每个请求的产品数量限制为 10 个。

所以我有一个代码将我的 asin 数组分解为 10 组并将其链接到多个请求中但是,当我在每个请求开始后设置 1 秒等待然后再发出新请求时,它不起作用可靠且仍然 returns 一个错误,将每个请求的数量增加到 2 秒解决了这个问题,但让它太慢了。 (因为通常每个请求需要 0.5 秒,然后等待剩余的 1.5 秒)。

亚马逊没有任何关于这些限制究竟如何运作的文档,所以我们只能猜测。

有没有办法进一步改进它或使排队有所不同?

$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); 
}

我找到了 Product Advertising API 5.0 documentation here。此页面解释了您在允许的费率方面遇到的问题。

有一个合理的每日限制,但如果每次访问您的站点都会触发多次调用,您将很快 运行 超出您的配额或调用过于频繁。节流是必要的,否则第三方的一些错误代码可能会对 api 提供商造成 ddos​​。

在不了解你打算如何使用这个 api 的情况下,我建议你设置一个微服务后端,它缓存来自 api 的数据并有一个到原始队列的队列。然后你可以查询你自己的api,想查询多少就查询多少。

我想我找到了解决方案,似乎 paapi 5 对第一个 #1 和 #2 请求特别敏感。应该保持良好的暂停,之后请求速度可以提高到标称的每秒 1 次。

所以循环应该是这样的: 第一个请求, 自请求开始后暂停总共 2 秒, 第二个请求, 自请求开始后暂停总共 1 秒, 第三个请求, 自请求开始后暂停总共 1 秒, 第 4 个请求, ...等等

我怀疑它也可以在第一个请求结束后保持 1 整秒而不是总共 2 秒,然后切换到从请求开始计算的 1 秒总等待循环,但我还没有尝试一下以进行验证。显然,如果第一个请求超过 1 秒并抛出错误,那么我就会知道是这种情况。

编辑:它工作了一个小时然后又停止工作,为了确定,我将在每次请求后更改为 1 秒。这真的很弱智,因为他们服务器端无法判断它记录的具体时间,既不是请求的开始时间也不是请求的结束时间。似乎它可以在两者之间任意波动,每当违反 1 秒规则(随机发生)时,它就会开始抛出无数 429 错误。好的,我将等待 1 秒,希望我的请求本身比 1 秒快一点,这应该给我一些小的优势和可靠性,而不是每次等待整整 2 秒,就像我最初发布的例子一样。