コンテンツにスキップ

AWS SDK for PHP: DynamoDB だけ? リトライを 10 回する件

参考) retries - AWS SDK for PHP

概要

リファレンス上リトライのデフォルトは以下のとおり(のはず)だが、DynamoDB のときだけ(?) 10 回リトライしている。

  • retry_mode: legacy
  • max_attempts: 3

DynamoDB (リトライ未指定)

$ddbClient = new Aws\DynamoDb\DynamoDbClient([
    'region' => 'ap-northeast-1',
    'version' => '2012-08-10',
    'endpoint' => 'http://192.168.1.1',  // 応答なし
    'http' => [
        'connect_timeout' => 3,
    ],
]);
$res = $ddbClient->query($params);

→10 回リトライ (計 11 回試行) してエラー。

DynamoDB (リトライ指定)

$ddbClient = new Aws\DynamoDb\DynamoDbClient([
    'region' => 'ap-northeast-1',
    'version' => '2012-08-10',
    'endpoint' => 'http://192.168.1.1',  // 応答なし
    'http' => [
        'connect_timeout' => 3,
    ],
    'retries' => [
        'mode' => 'legacy',
        'max_attempts' => 3,
    ],
]);
$res = $ddbClient->query($params);

→リトライ 3 回 (計 4 回試行) してエラー。

推測

上記のようにリトライを明示的に指定したところ、まれに InternalServerError で失敗する現象が発生するようになった。AWS のサポートに問いあわせたところ、「内部的なフェールオーバーやスケーリングなどがサービス側で自動でおこなわれ、InternalServerError が発生する場合がある」とのこと。特に legacy リトライモードではリトライ間隔が(観測した限りでは)徐々に間隔を空けていくエクスポネンシャルバックオフっぽい挙動であるものの、リトライ 3 回ではその間隔が非常に短いため、リトライで回収しきれず結果エラーとなってしまっている気がする。そのための 10 回リトライ? (あくまで推測です!)

結論

standard リトライモードを使いましょう。