AWS SDK for PHP:如何重试异步失败?

时间:2017-03-13 01:35:19

标签: php amazon-web-services guzzle amazon-polly

我在异步模式下使用AWS Polly和AWS SDK for PHP。

Polly的速率限制为每秒80,而我希望能够突发并做更多,如果他们的API返回503速率限制,我想重试请求(我的脚本工作正常,如果在限速)。

文档声明有一个retries option,但它什么也没做:如果我将它设置为0或1000并不重要,它似乎没有重试,我从SDK中得到了拒绝的承诺。也许它只适用于同步请求?

$polly = new PollyClient($config);

// $config
array (size=4)
  'version' => string 'latest' (length=6)
  'credentials' => 
    array (size=2)
      'key' => string 'xxx' (length=20)
      'secret' => string 'xxx' (length=40)
  'region' => string 'eu-west-1' (length=9)
  'retries' => int 1000

请注意,按正确顺序unwrap返回的承诺也很重要(例如,回复应与请求的顺序相同)。

我认为这段代码并不重要,但无论如何它都是

foreach ($textChunks as $textChunk) {
    try {
        $promise = $promises[] = $polly->synthesizeSpeechAsync([
            'OutputFormat' => 'mp3',
            'Text' => $textChunk,
            'TextType' => 'text',
            'VoiceId' => 'Amy',
        ]);

        $promise->then(
            function() use () {
                // resolved
            },
            function() {
                // rejected
            }
        );
    } catch (PollyException $e) {
        // log
    }
}

try {
    $results = GuzzleHttp\Promise\unwrap($promises);
} catch (Throwable $e) {
    // log
}

1 个答案:

答案 0 :(得分:0)

正如this GitHub issue与AWS PHP SDK开发人员所讨论的那样:

https://github.com/aws/aws-sdk-php/issues/1214#issuecomment-292002487

  

如果失败,则会自动重试所有异步请求。

https://github.com/aws/aws-sdk-php/issues/1214#issuecomment-301609123

  

PHP SDK将使用multi_curl发送异步请求。当前一次失败时会重试一个新请求,因此订单会被保留,直到使用multi_curl进行调度。