【问题标题】:DynamoDB - Is Remove on List a linear or constant-time op? or does it matter (for consistency or compute)?DynamoDB - 列表上的删除是线性还是恒定时间操作?还是重要(为了一致性或计算)?
【发布时间】:2020-07-04 20:45:38
【问题描述】:

我的问题是关于 DynamoDB REMOVE on a List 的时间复杂度...

  • 我知道 DynamoDB 操作是从客户端抽象出来的(例如 boto3 在 AWS Lambda 或 EC2 中),在 DynamoDB 本身内 - 但是 无论如何,DynamoDB 操作的运行时复杂性是否会影响 Read Consistency,或影响调用的计算的运行时间 DynamoDB 操作(例如 Lambda/EC2)?
  • 我也知道(在一般复杂性理论中)删除一个元素 从有序列表或数组,使得列表/数组元素 是随后/在移除的元素之后移动 1 [向左] 替换被移除的其他 [null/empty] 间隙 元素的原始索引/位置,是一个线性 O(n) 过程:所有 以下元素必须移动,并且它们的数量在 O(n) 的顺序。

最终结果(以下元素转移以弥补差距),也是在其上的 DynamoDB List after a REMOVE 操作上特别发生的结果[每个 DynamoDB 实施] - 但 我不知道事实上,列表中REMOVE 的 DynamoDB 内部时间复杂度是:O(n) 还是 O(1)?

无论它是什么,“如果操作是 DynamoDB 内部的,为什么这很重要”?以下是原因(如果它们是正确的):

  • 如果 DynamoDB 被同步调用* [而不是异步],则客户端会等待 DynamoDB 完成/返回,因此 DynamoDB 运行时会添加到客户端的运行时中
  • 我不能 100% 确定操作的 DynamoDB 运行时是否会影响所操作数据的读取一致性 - 读取一致性是否会随着 DynamoDB 操作完成的时间越长而降低? [fwiw,我会推断,是的,它会退化]

fwiw 我对这些问题很好奇,因为我正试图决定是否致电 REMOVE 以从中受益而不留下差距,或者实施一些可以代替差距的东西。

*例如,我认为boto3 本身会进行同步 DynamoDB 调用(尽管仍然使用 python 进行异步调用,但对于 aiobotocoreaioboto3 这样的项目来说可能是可能的)。

【问题讨论】:

  • 答案是我们不知道。如果它对您来说真的很重要,那么您最好的选择可能是对各种场景进行计时,并确定您是否可以依赖一致的行为,然后进行相应的编程。

标签: amazon-web-services amazon-ec2 aws-lambda amazon-dynamodb boto3


【解决方案1】:

回答

当您执行任何操作(读取除外)时,它将被计为写入操作。

请记住,写入是按每 1kb 计算的,这是使用积分的方式,因此写入速度应该均匀分布在现有的积分池中。当分区不均匀或积分耗尽时,您会看到写入时间发生变化。

与 SDK 的时间差异会更大,此时您受到网络传输的限制,因此您可能会说这是 linear 而不是 constant .

对于 DynamoDB,UpdateItem 操作是写入操作,这意味着服务需要在所有可用区的每个节点上更新此操作,当您读取时,它将从这些节点之一读取。

默认情况下,SDK 将使用最终的consistency,这意味着它不会关心最准确的答案,它会查询其中一个节点并接受它作为真实答案(即使另一个节点有更新的回答)。

请记住,此过程以毫秒为单位(我相信可能长达一秒)。

对 AWS 服务方法的额外投入

AWS 有一个通用方法(尽管我无法确认这是否是 DynamoDB 在幕后实施的方式)。事实上,大多数(如果不是全部)AWS 服务的设计和开发方式是它们具有多个层次。 EC2 和 Route 53 已确认这一点。

第一层(控制平面)充当验证请求是否正常的媒介,它通过运行与服务层相同的验证来做到这一点,即语法、值等,但它不执行那个行动。成功或不成功的响应都会返回。

SDK 收到此信息,您的代码继续执行,第一层同时交给服务层(数据平面)尝试执行此操作(重复以防失败)。该服务层执行操作并有望成功。

如果您有兴趣,请观看来自 RE:Invent 的 Beyond five 9s: Lessons from our highest available data planes 视频。

【讨论】:

  • 嗨,克里斯,我不确定您对控制平面的一般描述,该控制平面预先验证请求并在执行实际操作之前向客户端提供响应,如果这就是您的意思, 是正确的,尤其是在 DynamoDB 更新的情况下。毫无疑问,一些初步的参数验证可能会以这种方式进行。你有支持这一点的文档吗?
  • 它在附在@jarmod 的视频中。这就是 AWS 构建其 API 以实现弹性的方式:)
  • 下面是 DynamoDB 的操作列表,真正的操作发生在:docs.aws.amazon.com/amazondynamodb/latest/developerguide/…@jarmod
  • 您所指的视频片段是在 31:25 左右开始的名为 Modular Separation 的视频片段,Colm 指出该片段用于 Route53 和 IAM,也许还有其他。我没有看到任何证据表明这是 DynamoDB 设计的一部分。
  • 嗨@jarmod,点明白它没有明确说明。我已经整理了答案,希望让 OP 明白这一点
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多