Способ отличить guish DynamodB TransactionCanceledException - PullRequest
0 голосов
/ 22 января 2020

У меня есть API с транзакцией, которая использует DynamoDB в качестве базы данных. Я получу два вида исключений. Одна из них связана с исключением ConditionalCheckFailed , когда условие не выполняется. Объект ошибки выглядит следующим образом:

{
    "message": "Transaction cancelled, please refer cancellation reasons for specific reasons [None, ConditionalCheckFailed]",
    "code": "TransactionCanceledException",
    "time": "2020-01-22T05:46:32.756Z",
    "requestId": "UG14A08TDB6Q5CADF0NH9JQAB3VV4KQNSO5AEMVJF66Q9ASUAAJG",
    "statusCode": 400,
    "retryable": false,
    "retryDelay": 32.837614849025734
}

В другом сценарии, когда я выполняю нагрузочное тестирование на одном и том же API, я получу TransactionConflict исключение.

{
    "message": "Transaction cancelled, please refer cancellation reasons for specific reasons [None, TransactionConflict]",
    "code": "TransactionCanceledException",
    "time": "2020-01-22T05:54:40.940Z",
    "requestId": "87MHRV37F3G3EUUF629AKICARBVV4KQNSO5AEMVJF66Q9ASUAAJG",
    "statusCode": 400,
    "retryable": false,
    "retryDelay": 31.786748424710908
}

Я хочу повторить транзакцию при ошибке из-за TransactionConflict исключение. Но я не уверен, как условно повторить транзакцию с этой информацией об ошибке. Поскольку часть сообщения является единственным ключом, который сообщает мне точную причину ошибки, а не сам код ошибки.

Я не думаю, что сравнение сообщения - это хороший способ условно обработать ошибку.

Ответы [ 2 ]

2 голосов
/ 25 января 2020

Не думаю, что сравнение сообщения - это хороший способ условно обработать ошибку.

Я полностью согласен, но:

  • AWS очень хорошо не меняет API, поэтому вы , вероятно, согласны с этим подходом, и
  • они, похоже, не дали вам никакой альтернативы.

Безопасный подход, я бы посоветовал, заключается в сопоставлении строки с сообщением, а также в создании собственного исключения, если вы получаете TransactionCanceledException с сообщением, которое не сопоставлять любую ожидаемую строку - не просто проверять, равна ли она / не равна одной возможной строке, но вместо этого проверять ее на все известные / релевантные значения и, если она не соответствует ни одному известному шаблону, остановить и загореться. Это исключает риск непредвиденных изменений в тексте ошибки, в результате чего ваш код будет работать некорректно.

0 голосов
/ 25 января 2020

Насколько я знаю, все 400 ошибок от DynamoDB NON retry-able. Это означает, что есть проблема с способом, которым получают запрос API, и это не правильно, и следовательно 400 Ошибка.

Итак, в вашем случае я бы предложил исправить проблему, а затем добавить повторную попытку, когда вы получите исключение с возможностью повторной попытки. Для более подробной информации: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html

Только 500 ошибок повторяются.

...