DeleteItem和PutItem请求中的ReturnValue.ALL_OLD是否消耗额外的容量?

时间:2018-08-23 13:48:18

标签: amazon-web-services amazon-dynamodb

我已经寻找了一段时间,找不到任何确定是否在DeleteItem和PutItem请求中包含ReturnValue.ALL_OLD的确定性内容。

一方面,这是有道理的,因为我可以轻松地想象它必须执行单独的读取(这会打到您的RCU)。

另一方面,响应JSON似乎无法指定消耗的READ容量和消耗的WRITE容量。 DeleteItem和PutItem都消耗写入容量,但是我假设如果指定ReturnValue.ALL_OLD确实消耗了额外的容量,它将被读取,而且我看不到AWS会将两者合而为一。

另一方面,针对UpdateItem的AWS文档特别指出,由于ReturnValue的使用,没有消耗额外的容量,而UpdateItem是基于写入的操作,例如DeleteItem和PutItem。

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html#API_UpdateItem_ReturnValues

  

如果要获取在更新之前或之后显示的项目属性,请使用ReturnValues。对于UpdateItem,有效值为:

     

无-如果未指定ReturnValues,或者其值为NONE,则不返回任何内容。 (此设置是ReturnValues的默认设置。)

     

ALL_OLD-返回该项目的所有属性,就像它们在UpdateItem操作之前一样。

     

UPDATED_OLD-仅返回更新的属性,如它们在UpdateItem操作之前一样。

     

ALL_NEW-返回该项目的所有属性,它们在UpdateItem操作之后显示。

     

UPDATED_NEW-仅返回在UpdateItem操作之后显示的更新属性。

     

除了小型网络外,没有其他与请求返回值相关的开销,也没有接收较大响应的处理开销。不会消耗读取容量单位。

有人从AWS获得任何信息或知道此问题的确切来源吗?

1 个答案:

答案 0 :(得分:0)

根据我的经验,我知道这是对的,但是我已经给出了详尽的答案,以便您对此有信心。这是文档的一些相关部分,在此我将对其进行一些评论。

UpdateItem (documentation)

  

您还可以使用ReturnValues参数在同一UpdateItem操作中返回项目的属性值。

     

...

     

除了小型网络外,没有其他与请求返回值相关的开销,也没有接收较大响应的处理开销。没有消耗读取容量单位。

     

返回的值非常一致。

PutItem (documentation)

  

您可以使用ReturnValues参数以相同的操作返回项目的属性值。

     

...

     

ReturnValues参数由多个DynamoDB操作使用。但是,PutItem无法识别NONE或ALL_OLD之外的任何其他值。

DeleteItem (documentation)

  

除了删除项目外,还可以使用ReturnValues参数在同一操作中返回项目的属性值。

     

...

     

ReturnValues参数由多个DynamoDB操作使用。但是,DeleteItem不能识别NONE或ALL_OLD之外的任何其他值。


我认为这里需要注意几件事。

  • 所有三个API都提到可以在同一操作中返回值。仅UpdateItem明确声明您不消耗任何RCU。让我问你一个问题:由于DynamoDB必须先读取该项目以检查条件,因此进行条件删除是否需要额外的读取功能?不能。DynamoDB非常一致地认为,一个操作可以被读取,但不能两者都被读取,在这种情况下,很明显ReturnValues始终是同一操作的一部分。 / li>
  • 文档明确指出了ReturnValues被多个API方法使用的事实,并且当存在差异时也明确指出了差异。文档没有提到ReturnValues如何影响消耗的容量。

您还可以自己运行一个简单的实验,看看是否正确。

  1. 创建一个新表,将读取容量设置为1,并将写入容量设置为> = 10。
  2. 编写一个脚本,该脚本将在PutItem和DeleteItem之间交替(请求两者的返回值),直到您认为有足够的数据点为止。 (一次就足够了,但是如果您每秒进行几次(可能持续1分钟),则可以更轻松地在表格指标中看到它。)
  3. 如果返回旧值确实消耗了读取容量,则应该在表指标中看到(大约)与消耗的写入容量匹配的消耗的读取容量。
  4. 如果您以每秒大于1个请求的速度运行足够长的时间,那么如果且仅当您对读取收费时,最终您会看到一些读取限制。 (您需要有一个持续的负载,该负载将耗尽所有突发容量。如果您能够以每秒10个请求的速度运行它,那么不到一分钟您的突发读取容量就会被消耗, if 完全不使用任何读取容量。)

更新:我进行了一些手动测试,并确认带有返回值的写操作不会消耗任何RCU。