繁体   English   中英

为什么ListBlobsSegmentedAsync仅在第二页上返回结果?

[英]Why is ListBlobsSegmentedAsync only returning results on second page?

问题

我试图抓住一页最多5000个blob,没有前缀。 有问题的容器中大约有26,000个斑点。 我在第一页上一直没有得到任何结果,但我注意到返回的BlobContinuationToken不是null,所以我可以再次翻页并在第二页上获得结果。 为什么第一页上没有任何结果,但第二页有什么结果?

我希望能够做到这一点,并只抓一页:

var response = await container.ListBlobsSegmentedAsync(null).ConfigureAwait(false);

但是这没有返回结果,所以相反,我必须再次调用它,传递continuationToken,此时我得到结果。

我考虑过的

  • 这只是在容器变小时才开始发生(它曾经有超过100,000个blob)
  • 我在这个容器上经常删除,但我找不到任何说这会影响可用性的东西
  • 我尝试传入true for useFlatBlobListing并且它没有改变任何东西,但我真的不明白这个选项(据我所知,我的容器的内容是扁平的)
  • 我之前使用过ListBlobsSegmentedAsync ,从未注意到这个问题(但容器更大)
  • 我正在使用已经过时的Storage SDK 4.3.0版。 我尝试更新,但它没有解决问题,所以我回去了
  • 我尝试过传递null continuationToken以及new BlobContinuationToken() 我不确定一个人是否更可取
  • 我可以通过Visual Studio中的Cloud Explorer验证容器中仍有26,000个blob,但不能在结果的第一页上的代码中验证。 我想知道Cloud Explorer的做法有何不同?

编辑更多疑难解答

在较大的容器上,经过一段时间后,它开始采取两次以上的页面提取以获得结果。 每个页面提取(包括空页面)大约需要5秒钟,直到它最终返回结果。 我看到它在峰值时最多需要12页提取,总计超过60秒才能在一个容量超过300,000的容器上返回结果。 这是在对容器进行大量删除之后不久。

您可以偶尔获得空页或具有小于最大结果的页面以及延续令牌,这一点都不出意外。 如果返回的延续令牌将您带到下一页,为什么会出现问题? 如果您不想处理延续令牌,ListBlobs(不是分段版本)将提供一个迭代器,它将懒洋洋地获得更多blob并为您遵循延续令牌。

至于根本原因,可能会发生很多原因。 我的猜测实际上是你的情况经常删除,但这是一个猜测。 返回少于最大结果的数量并且由于多种原因而继续发生,但我怀疑这里有一对:1。我们达到服务器端超时,所以我们返回到目前为止的内容2.命中分区的边缘当blob列表很大并且可能跨越多台机器时,会更频繁地发生。 如果你经常删除blob并且有很多东西可能需要一些时间来实际垃圾收集,所以我们将花费所有时间来扫描我们不返回的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM