dynamodb TransactionCanceledException 的区分方法

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异常,我想在错误时重试事务。但我不确定如何使用此错误信息有条件地重试事务。由于消息部分是唯一告诉我错误确切原因的关键,而不是错误代码本身。

我不认为比较消息是有条件处理错误的好方法。

Mic*_*bot 5

我不认为比较消息是有条件处理错误的好方法。

我完全同意,但是:

  • AWS 非常擅长不更改 API,因此您可能会接受这种方法,并且
  • 他们似乎没有给你任何选择。

我建议,一种安全的方法是对消息进行字符串匹配,但如果收到与任何预期字符串TransactionCanceledException匹配的消息,也可以抛出自己的异常- 不要简单地测试它是否相等/不等于一个可能的字符串,而是测试它的所有已知/相关值,如果它不匹配任何已知模式,则停止并着火。这消除了错误文本意外更改而导致代码行为异常的风险。

  • 我对这个问题的研究似乎也反映了这种情绪。除了实例化的注释字符串之外,异常本身几乎没有携带任何有用的信息。这是 AWS 工具的一个完全令人抓狂的特征,但我认为你是对的,这一点不太可能改变。因此,现在如果您想编写一个智能应用程序,您可以解析字符串中的错误“数组”,并尝试将它们映射回您的事务包含的多个操作。乐趣。 (2认同)

das*_*ser 0

据我所知,DynamoDB 的所有 400 错误都是NON retry-able. 这意味着 API 请求的接收方式存在问题且不正确,因此会出现 400 错误。

因此,就您的情况而言,我建议解决问题,然后在收到可重试异常时添加重试。更多参考:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html

只有 500 个错误可以重试。

  • 这并不完全正确,因为 OP 指的是更高级别的重试,其中应用程序代码显示“嗯,TransactionConflict?这可能是暂时的,所以我想制作一个新的、相同的请求,并再次尝试相同的操作”。它有可能随后成功,因此不是文档中讨论的意义上的“重试”。*“在再次提交请求之前,您必须解决应用程序中的问题”*此处不适用,因为该请求没有错误,它只是与当时尝试冲突事务的另一个请求发生冲突。 (2认同)