是Azure的Put Blob操作原子



Azure的Put Blob REST API操作的文档告诉我们,可以通过单个请求上传最多64 MB的块Blob。

我想知道这样的操作是否是原子的。我特别需要知道以下假设是对还是错。

  1. 如果两个或多个客户端同时使用指定If-None-Match: *的API来放置特定的不存在的blob,则其中最多一个将成功。

  2. 使用此API放置的blob永远不会部分暴露。它要么不存在,要么与包含元数据的整个内容(<64MB)一起存在。

有人能证实或反驳这些假设吗?

我直接从微软技术支持人员那里得到确认,这两个假设都是正确的:

  1. 如果两个或多个客户端同时使用指定If-None-Match: *的API来放置特定的不存在的blob,则最多有一个将成功。

  2. 使用此API放置的blob永远不会部分暴露。它要么不存在,要么与包含元数据的整个内容(<64MB)一起存在。

Azure Put Blob操作是原子的吗?答案:一点也不。

在步骤3完成之前,任何读取blob的尝试都将返回HTTP 404(未找到).

是的,100%安全,你会收到一个404

在步骤3完成后,任何读取blob的尝试都将要么查看整个blob内容和元数据,要么生成HTTP404(未找到),如果步骤3不成功。

是,如果操作未完成,则blob存储中没有文件

任何将带有If-None-Match: *头的blob放在步骤2的开始也必须等到步骤3完成在这种情况下,请求必须通过HTTP 409失败(前提条件失败)或正常继续,因为blob不会存在。

在我的测试中:没有等待。

因此,通常在第二次尝试上传相同的文件名后,您将收到一个HTTP/1.1 409指定的blob已经存在。(如果你已经发送了请求 if - none - match:*报头)

问题是,如果第一个上传文件还没有收到第一个201确认(或者如果你在一个请求中上传所有文件是唯一的),那么第二个文件将被允许创建资源,即使它是在第一个文件之后启动的。如果第二个文件比第一个文件短,则会发生这种情况,因为可能在第一个(短)请求中文件就会完成传输。

最奇怪的是,当这种情况发生时,第一个流将继续正常上传数据,直到发出最后一个请求,最后一个请求的答案将是409。

我强烈建议您创建一个峰值解决方案来测试您的特定用例,因为上面描述的情况可能不是您应用程序的有效用例。

最新更新