我正在尝试抓取一页最多5000个blob,没有前缀。有问题的容器中大约有26,000个斑点。我在第一页上一直没有得到任何结果,但我注意到返回的BlobContinuationToken
不是空的,所以我可以再次翻页并在第二页上获得结果。 为什么第一页上没有任何结果,但第二页上有结果?
我希望能够做到这一点,只抓一页:
var response = await container.ListBlobsSegmentedAsync(null).ConfigureAwait(false);
但是这没有返回结果,所以相反,我必须再次调用它,传递continuationToken,此时我会得到结果。
true
传递给useFlatBlobListing
但它没有改变任何东西,但我真的不明白这个选项(据我所知,我的容器内容是平的) ListBlobsSegmentedAsync
并且从未注意到这个问题(但容器更大)new BlobContinuationToken()
。我不确定是否更适合在一个较大的容器上,一段时间后它开始进行两次以上的页面提取以获得结果。每个页面提取(包括空页面)大约需要5秒钟,直到它最终返回结果。我看到它在峰值时最多需要12页提取,总计超过60秒才能在一个容量超过300,000的容器上返回结果。这是在对容器进行大量删除后不久。
答案 0 :(得分:3)
您可以偶尔获得空页或具有小于最大结果的页面以及延续令牌,这一点都不出意外。如果返回的延续令牌将您带到下一页,为什么会出现问题?如果你不想处理延续令牌,那么ListBlobs(不是分段版本)会给你一个迭代器,它会懒得获得更多blob并为你追随延续令牌。
至于根本原因,可能会发生很多原因。我的猜测实际上是你的情况经常删除,但这是一个猜测。返回少于最大结果的数量并且由于多种原因而继续发生,但我怀疑这里有一对:1。我们达到服务器端超时,所以我们返回到目前为止的内容2.命中分区的边缘当blob列表很大并且可能跨越多台机器时,会更频繁地发生。如果你经常删除blob并且有很多东西可能需要一些时间来实际垃圾收集,所以我们会把所有时间花在扫描我们不会返回的东西上。