Azure Put Blob 操作是原子的吗?

Is the Azure Put Blob operation atomic?

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

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

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

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

谁能证实或反驳这些假设?

Azure Put Blob 操作是原子操作吗? 答:完全没有。

Any attempt to read the blob before the completion of step 3 would result in HTTP 404 (not found).

是的,100% 安全,您会收到 404

Any attempt to read the blob after the completion of step 3 would either see the entire blob content and meta data, or result in HTTP 404 (not found) in case step 3 was not successful.

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

Any attempt to put the blob with an If-None-Match: * header before the start of step 2 would have to wait until step 3 is completed, either successfully in which case the request must fail with HTTP 409 (precondition failed) or continue normally, since the blob would not exist.

在我的测试中:无需等待。

因此,通常在第二次尝试上传相同文件名后,您将收到 HTTP/1.1 409 指定的 blob 已存在。 (如果你发送了带有 If-None-Match 的请求:* header)

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

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

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

我已直接从 Microsoft 支持技术人员处收到确认,这两个假设都是正确的

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

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