Azure Put Blob 操作是原子的吗?
Is the Azure Put Blob operation atomic?
Azure 的 Put Blob REST API 操作文档告诉我们,可以通过单个请求上传最大 64 MB 的块 blob。
我想知道这样的操作是否是原子的。特别是我需要知道以下假设是对还是错。
如果两个或多个客户端同时使用此 API 指定 If-None-Match: *
放置一个特定的不存在的 blob,则最多其中一个会成功。
使用此 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 支持技术人员处收到确认,这两个假设都是正确的:
如果两个或多个客户端同时使用此 API 指定 If-None-Match: *
放置一个特定的不存在的 blob,则最多其中一个会成功。
使用此 API 放置的 blob 永远不会部分暴露。它要么不存在,要么与放置的全部内容 (<64MB) 一起存在,包括元数据。
Azure 的 Put Blob REST API 操作文档告诉我们,可以通过单个请求上传最大 64 MB 的块 blob。
我想知道这样的操作是否是原子的。特别是我需要知道以下假设是对还是错。
如果两个或多个客户端同时使用此 API 指定
If-None-Match: *
放置一个特定的不存在的 blob,则最多其中一个会成功。使用此 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 支持技术人员处收到确认,这两个假设都是正确的:
如果两个或多个客户端同时使用此 API 指定
If-None-Match: *
放置一个特定的不存在的 blob,则最多其中一个会成功。使用此 API 放置的 blob 永远不会部分暴露。它要么不存在,要么与放置的全部内容 (<64MB) 一起存在,包括元数据。