我有一個在Azure blob存儲上託管的Excel文件,用於記錄與網站相關的使用情況統計信息。訪問Azure存儲的應用程序是一個Web API,它利用blob參考和內存流異步地從blob 來回寫入數據。Azure blob存儲中的讀寫器鎖定
將數據寫回到blob的異步操作是否作爲讀寫器問題的一部分進行處理,例如可以說最初有10條記錄,現在有兩個用戶同時訪問blob。這個blob是否會更新爲最終有12條記錄?
我有一個在Azure blob存儲上託管的Excel文件,用於記錄與網站相關的使用情況統計信息。訪問Azure存儲的應用程序是一個Web API,它利用blob參考和內存流異步地從blob 來回寫入數據。Azure blob存儲中的讀寫器鎖定
將數據寫回到blob的異步操作是否作爲讀寫器問題的一部分進行處理,例如可以說最初有10條記錄,現在有兩個用戶同時訪問blob。這個blob是否會更新爲最終有12條記錄?
是否將寫入數據的異步操作返回到作爲讀寫器問題的一部分處理的blob ,例如,可以說 最初有10條記錄,現在兩個用戶同時訪問 blob。將blob更新爲 最後有12條記錄?
假設兩個用戶同時讀取blob,最後一個更新blob將覆蓋其他用戶完成的更改。所以用戶A和B讀取blob。現在用戶A更新blob,並在用戶B更新blob後不久。在這種情況下,用戶A完成的更改將被用戶B覆蓋。
您可以通過在更新請求中指定條件標頭來防止此行爲。這是由許多東西促成的,但最常使用的是blob上的ETag
屬性。在這種情況下,用戶A和B都會讀取blob。它們都對blob的ETag具有相同的值。現在,用戶A有條件地更新blob(即,只有在更新期間顯示的ETag值與blob的最新ETag值匹配時,才告知Azure存儲服務更新blob)。由於blob沒有被其他人更新,所以此操作將成功。現在用戶B也有條件地更新blob,但是當用戶A更新blob時,此更新將失敗,其ETag值已更改。在這種情況下,用戶B需要再次獲取blob的內容並應用更改並再次保存blob。
如果所有用戶都將數據添加到blob的末尾,另一個選擇是使用Append Blobs
。 Append Blobs
沒有這個問題。
要添加到@ Gaurav的答案,您也可以讓您的代碼首先對blob進行租用以確保一次寫入一個作者。 – GregGalloway
@GregGalloway我也考慮過這個問題,但恕我直言租賃在這種情況下不是正確的選擇,主要是因爲租約期限太短(60秒)或太長(無限)。使用短租將需要經常更新租約(每分鐘閱讀一次)。使用長期租賃有一個問題,用戶放棄之間的更新會導致blob永久鎖定。 –