Как предотвратить исключение DynamoDb ProvisionedThroughputExceededException в Laravel - PullRequest
0 голосов
/ 12 февраля 2019

Я обновляю определенное количество записей в течение длительного периода времени, и у меня нет уверенности в сроках, в которые записи будут производиться.Иногда, когда создается много записей одновременно, я получаю запись в журнале ошибок, в которой говорится, что я нажал ProvisionedThroughputExceededException.

. Я хотел бы предотвратить это исключение или, по крайней мере, иметь возможностьпоймать исключение (а затем повторно выдать его, чтобы я не изменил логику), но все, что я получаю, это журнал ошибок ниже:

[2019-02-12 15:50:48] local.ERROR: Error executing "UpdateItem" on "https://dynamodb.eu-central-1.amazonaws.com"; AWS HTTP error: Client error: `POST https://dynamodb.eu-central-1.amazonaws.com` resulted in a `400 Bad Request` response:

Журнал продолжается, и мы можем найти немного больше деталей:

ProvisionedThroughputExceededException (client): The level of configured provisioned throughput for the table was exceeded. Consider increasing your provisioning level with the UpdateTable API. -
{
    "__type": "com.amazonaws.dynamodb.v20120810#ProvisionedThroughputExceededException",
    "message": "The level of configured provisioned throughput for the table was exceeded. Consider increasing your provisioning level with the UpdateTable API."
}
{"exception":"[object] (Aws\\DynamoDb\\Exception\\DynamoDbException(code: 0): Error executing \"UpdateItem\" on \"https://dynamodb.eu-central-1.amazonaws.com\"; AWS HTTP error: Client error: `POST https://dynamodb.eu-central-1.amazonaws.com` resulted in a `400 Bad Request` response:

Итак, исключение было сгенерировано, но похоже, что оно уже поймано, хотя я бы хотел поймать его сам, даже только чтобы отследить его и, возможно, избежать исключения ввсе.

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 22 февраля 2019

Чтобы избежать исключения, очевидным ответом будет «Использовать автоматическое масштабирование на емкости DynamoDb».И это то, что я сделал, с определенной степенью удачи: когда всплеск запроса возник, у меня все еще было исключение, но в среднем автомасштабирование работало довольно хорошо.Вот CloudFormation для автоматического масштабирования:

MyTableWriteScaling:
  Type: AWS::ApplicationAutoScaling::ScalableTarget
  Properties:
    MaxCapacity: 250
    MinCapacity: 5
    ResourceId: !Join ["/", ["table", !Ref myTable ]]
    ScalableDimension: "dynamodb:table:WriteCapacityUnits"
    ServiceNamespace: "dynamodb"
    RoleARN: {"Fn::GetAtt": ["DynamoDbScalingRole", "Arn"]}

WriteScalingPolicy:
  Type: AWS::ApplicationAutoScaling::ScalingPolicy
  Properties:
    PolicyName: !Join ['-', [!Ref 'AWS::StackName', 'MyTable', 'Write', 'Scaling', 'Policy']]
    PolicyType: TargetTrackingScaling
    ScalingTargetId: !Ref MyTableWriteScaling
    ScalableDimension: dynamodb:table:WriteCapacityUnits
    ServiceNamespace: dynamodb
    TargetTrackingScalingPolicyConfiguration:
      PredefinedMetricSpecification:
        PredefinedMetricType: DynamoDBWriteCapacityUtilization
      ScaleInCooldown: 1
      ScaleOutCooldown: 1
      TargetValue: 60
  DependsOn : MyTableWriteScaling

Тем не менее, у меня все еще было Исключение.Я знал, что дросселированные запросы в конечном итоге будут написаны, но я искал способ предотвратить исключение, так как не смог его перехватить.

Способ сделать это был представлен Amazon в ноябре28 и это DynamoDB по запросу.

Весьма полезно, в объявлении, которое мы читаем:

DynamoDB по требованию полезен, если трафик вашего приложения трудно прогнозировать и контролировать, ваша рабочая нагрузка имеет большие всплески короткой продолжительности,или если ваше среднее использование таблиц значительно ниже пика.

Настройка по требованию в CloudFormation не может быть проще:

HotelStay:
  Type: AWS::DynamoDB::Table
  Properties:
    BillingMode: PAY_PER_REQUEST
    ...

Изменение BillingMode и удалениеProvisionedThroughput предотвратило появление такого рода исключений, они просто исчезли навсегда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...