NIK*_*C M 5 error-handling node.js amazon-dynamodb
我有一个带有事务的 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
}
Run Code Online (Sandbox Code Playgroud)
另一种情况是,当我对同一个 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
}
Run Code Online (Sandbox Code Playgroud)
由于 TransactionConflict异常,我想在错误时重试事务。但我不确定如何使用此错误信息有条件地重试事务。由于消息部分是唯一告诉我错误确切原因的关键,而不是错误代码本身。
我不认为比较消息是有条件处理错误的好方法。
我不认为比较消息是有条件处理错误的好方法。
我完全同意,但是:
我建议,一种安全的方法是对消息进行字符串匹配,但如果收到与任何预期字符串不TransactionCanceledException匹配的消息,也可以抛出自己的异常- 不要简单地测试它是否相等/不等于一个可能的字符串,而是测试它的所有已知/相关值,如果它不匹配任何已知模式,则停止并着火。这消除了错误文本意外更改而导致代码行为异常的风险。
据我所知,DynamoDB 的所有 400 错误都是NON retry-able. 这意味着 API 请求的接收方式存在问题且不正确,因此会出现 400 错误。
因此,就您的情况而言,我建议解决问题,然后在收到可重试异常时添加重试。更多参考:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html
只有 500 个错误可以重试。
| 归档时间: |
|
| 查看次数: |
8605 次 |
| 最近记录: |