AWS SDK для PHP: как повторить асинхронные сбои?

Я использую AWS Polly с AWS SDK для PHP в асинхронном режиме.

У Polly ограничение скорости 80 в секунду, в то время как я хочу иметь возможность взрываться и делать больше, и в случае, если их API возвращает 503 Rate Limiting, я хочу повторить запрос (мой скрипт работает нормально, если ограничение скорости) .

В документах указано, что существует опция повторных попыток, но ничего не делает: не имеет значения, устанавливаю ли я его на 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

Обратите внимание, что unwraping возвращаемых обещаний в правильном порядке также важно (например, ответы должны быть в том же порядке, что и запросы).

Я предполагаю, что этот код не очень важен, но все же здесь

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
}

person The Onin    schedule 13.03.2017    source источник
comment
@Michael-sqlbot Эй, спасибо за отличный совет. Я сделал именно это, поэтому мне удалось установить максимальный предел параллелизма. Однако то, что это делает, снижает вероятность ограничения скорости, но по-прежнему не позволяет мне повторять отклоненные обещания.   -  person The Onin    schedule 15.03.2017
comment
Честно говоря, я не очень хорошо знаком с SDK для PHP или лучшими практиками/шаблонами проектирования PHP в целом... но исходный код SDK должен дать вам некоторое представление о том, предназначен ли он для обработки повторных попыток с промисами или ожидается, что вы будет обрабатывать их (возможно, отправив запрос обратно в пул команд, который, как я предполагаю, будет продолжаться до тех пор, пока у него не закончатся дела). Также может быть, что это проблема с тем, какие виды сбоев соответствуют критериям повторных попыток.   -  person Michael - sqlbot    schedule 15.03.2017


Ответы (1)


Как обсуждалось в этой проблеме GitHub с разработчиком 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.

person The Onin    schedule 09.08.2017