簡體   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