2017-03-13 4 views
2

Ich verwende AWS Polly mit AWS SDK für PHP im asynchronen Modus.AWS SDK für PHP: Wie wiederhole ich asynchrone Fehler?

Polly hat eine Geschwindigkeitsbegrenzung von 80 pro Sekunde, während ich möchte Burst und mehr tun, und wenn ihre API 503 Rate Limiting zurückgibt, möchte ich die Anfrage wiederholen (mein Skript funktioniert gut, wenn Untergrenze).

Die Dokumentation gibt es eine retries option, aber es tut nichts: es spielt keine Rolle, wenn ich es auf 0 oder 1000, scheint es nicht zu wiederholen und ich bekomme abgelehnte Versprechen vom SDK. Vielleicht ist es nur gut für synchrone Anfrage?

$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 

Sie beachten Sie, dass unwrap die zurück Versprechen in der richtigen Reihenfolge ist wichtig ing zu (zum Beispiel Antworten in der gleichen Reihenfolge wie Anfragen sein sollen).

Ich nehme an diesem Code ist nicht wirklich wichtig, aber hier ist es trotzdem

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 
} 
+0

Was ist mit der Verwendung von ['CommandPool'] (https://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/commands.html#command-pool), um die Nummer zu behalten von gleichzeitigen Anfragen auf eine vernünftige Ebene? AWS missbilligt möglicherweise Anwendungen, die wiederholt eine Drosselung auslösen. –

+0

@ Michael-sqlbot Hey, danke für den tollen Rat. Ich habe genau das gemacht und daher das maximale Limit für den gemeinsamen Zugriff festgelegt. Was dies jedoch bewirkt, verringert die Wahrscheinlichkeit, dass die Rate begrenzt wird, aber es lässt mich immer noch nicht abgelehnte Versprechungen wiederholen. –

+0

Ich bin ehrlich gesagt nicht so vertraut mit dem SDK für PHP, oder PHP Best Practices/Design Patterns im Allgemeinen ... aber der SDK-Quellcode sollte Ihnen eine Idee geben, wenn es mit Versprechungen behandelt wird oder wenn die Erwartung ist Sie würden mit ihnen umgehen (vielleicht, indem Sie die Anfrage zurück an den Befehlspool senden, von dem ich anmaße, dass er so lange läuft, bis es keine neuen Aufgaben mehr gibt). Es könnte auch sein, dass dies ein Problem ist mit welchen Arten von Fehlern für Wiederholungen geeignet sind. –

Antwort

0

Wie in this GitHub issue mit AWS PHP SDK Entwicklern diskutiert:

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

Alle Asynchron-Anforderungen, wenn fehlgeschlagen werden automatisch erneut versucht.

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

PHP SDK multi_curl für das Senden von Asynchron-Anfragen verwenden. Eine neue Anforderung wird wiederholt, wenn eine vorherige einmal fehlschlägt, und daher wird die Reihenfolge beibehalten, bis sie mit multi_curl geplant wird.

Verwandte Themen