【问题标题】:AWS s3 simultaneous move of the same objectAWS s3同时移动同一对象
【发布时间】:2019-12-07 01:54:14
【问题描述】:

最近我想到了一件我还没有完全想到的事情。基本上,问题总结在问题中。在更广泛的意义上,我的问题如下:

(假设这些事情是由不同机器上的脚本或同一机器内的不同任务(并发)完成的)

假设我们有一个名为“bucket-one”的存储桶和一个对象,其中的键是“foo/bar.ext” 一个任务尝试将“foo/bar.ext”移动到“foo2/bar.ext”,另一个尝试将对象移动到“foo3/bar.txt”,例如,我们使用 boto3 s3 客户端/资源(但可能不会影响输出)。

当您尝试将对象同时从一个文件夹同时移动到同一存储桶中的另一个文件夹时会发生什么?

我想到的输出是:

  • 两个请求都会成功地将同一个文件移动到不同的文件夹中,因此我们现在同时拥有“foo2/bar.ext”和“foo3/bar.ext”。
  • 其中只有一个被移动到“foo2/bar.ext”或“foo3/bar.ext”
  • 两个请求均失败,对象未移动并保留为“foo/bar.ext”。
  • 上述所有情况都可能在事先不准确知道输出的情况下发生。

第二个问题只是时间上的变化“不是在确切的时间,而是非常接近(几乎相同的时间)”

我知道可能性不大,但我很好奇它会产生什么结果。

谢谢

【问题讨论】:

    标签: amazon-web-services amazon-s3 boto3 move


    【解决方案1】:

    唯一可能的结果是你得到两个目标对象。

    S3 不支持将对象移动到新键,它只支持在新键(无论是在同一个存储桶中还是不同存储桶中)制作对象的副本,然后通过第二个请求删除原始对象.

    删除已在复制或下载过程中的对象不会影响已对该对象进行的操作。

    此外,对最近删除的对象的授权删除操作永远不会失败(实际上,删除请求可能总是如此,但这个细节并不重要,这里)所以两个进程都不会知道另一个进程也刚刚当他们尝试时删除了对象,因为该操作会成功。

    你甚至不需要事情同时发生,就可以得到两个对象。

    如果事件以复制 1、复制 2、删除 1、删除 2 的顺序发生,只要删除 1 没有阻止,无论复制 1 和复制 2 发生的时间有多近,这仍然是结果复制 2 从开始...但实际上,对象上的删除操作本身并不是即时的,因此即使在删除 1 完成后的短暂时间段内开始复制 2,它也可能仍然有效。这是由 S3 为删除和覆盖操作提供的最终一致性行为引起的,这是一种优化,可以用这种一致性换取更高性能的 PUT 和 GET(包括复制)。完全一致的时间量不是一个固定值,通常接近于零。没有公开的接口来判断一个桶的索引副本是否完全一致。

    请参阅 Amazon Simple Storage Service 开发人员指南中的 Amazon S3 Data Consistency Model

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      相关资源
      最近更新 更多