使用azure-storage-api java在downloadAttributes上不存在指定的blob

时间:2016-09-12 10:33:51

标签: java azure azure-storage azure-blob-storage

我们有应用程序,其中许多(~1000)消费者尝试从blob存储中获取文件。 blob文件没有并发访问权限,但它们共享单个存储帐户。我看到blob存储上可用的文件,但我们经常看到下面的异常

Caused by: com.microsoft.azure.storage.StorageException: The specified blob does not exist.
at com.microsoft.azure.storage.StorageException.translateFromHttpStatus(StorageException.java:207)[3:org.ops4j.pax.logging.pax-logging-service:1.6.9]
at com.microsoft.azure.storage.StorageException.translateException(StorageException.java:172)[3:org.ops4j.pax.logging.pax-logging-service:1.6.9]
at com.microsoft.azure.storage.core.StorageRequest.materializeException(StorageRequest.java:306)[3:org.ops4j.pax.logging.pax-logging-service:1.6.9]
at com.microsoft.azure.storage.core.ExecutionEngine.executeWithRetry(ExecutionEngine.java:177)[3:org.ops4j.pax.logging.pax-logging-service:1.6.9]
at com.microsoft.azure.storage.blob.CloudBlob.downloadAttributes(CloudBlob.java:1268)[3:org.ops4j.pax.logging.pax-logging-service:1.6.9]
at com.microsoft.azure.storage.blob.CloudBlob.downloadAttributes(CloudBlob.java:1235)[3:org.ops4j.pax.logging.pax-logging-service:1.6.9]

我们正在使用

  

Azure-storage-api 1.1.0

这是一个已知的错误或限制吗? 我们将获得此异常的情况是什么?

我们使用以下代码下载blob

String storageConnectionString = "DefaultEndpointsProtocol=http;AccountName="+ storageAccount + ";AccountKey=" + primaryAccessKey;
CloudStorageAccount account = CloudStorageAccount.parse(storageConnectionString);
CloudBlobClient blobClient = account.createCloudBlobClient();
CloudBlobContainer container = blobClient.getContainerReference(containerName.toLowerCase());
CloudBlockBlob blockBlob = container.getBlockBlobReference(fileName);
blockBlob.downloadAttributes();
//http://stackoverflow.com/questions/1071858/java-creating-byte-array-whose-size-is-represented-by-a-long
int size = (int)blockBlob.getProperties().getLength();
out = new byte[size];
blockBlob.downloadToByteArray(out, 0);

2 个答案:

答案 0 :(得分:1)

什么是constantly?它是always,还是超过X消费者试图获取blob的时候?

Scalability Targets for Azure Storage上,您可以了解有关目标可伸缩性参数的更多信息。其中一个是单个blob的目标吞吐量:

  

单个blob的目标吞吐量高达每秒60 MB,或高达 500   请求每秒

对于1000名消费者,毫无疑问,在查询相同的blob时,您达到了这个限制。问题是 - 你真的需要从blob得到如此激烈的,你可以缓存到某个地方(中间facede)或者你可以使用CDN(它也适用于SAS's

如果1000名消费者遇到1000种不同的blob,则存在一些限制,例如:

  

总请求率(假设1KB对象大小)每个存储帐户最多 20,000 IOPS ,每秒实体数或每条消息   第二

其中,1000名消费者每秒发出20个请求 - 基于文件中的块数,也可能是这个限制。

无论如何,您应该修改您的申请并发现您遇到的限制。

答案 1 :(得分:0)

这是为了让扫描完下载所有请求网址的人在将来阅读此问题时清楚明白。

有一堆不存在的blob网址引起了这种异常。