簡體   English   中英

Azure存儲表 - 插入批處理行並檢查它們是否存在

[英]Azure Storage Table - Insert batch of row and check if they exists

我發送一些服務的查詢並獲得結果。 我想知道我過去是否已經得到了相同的“答案”。 所以,我計划使用Azure Table作為緩存機制。

我做了這個小POC:

TableBatchOperation batchOperation = new TableBatchOperation();
CachedUrl customer1 = new CachedUrl(Guid.Empty, "test1");
CachedUrl customer2 = new CachedUrl(Guid.Empty, "test2");
batchOperation.Insert(customer1);
batchOperation.Insert(customer2);
table.ExecuteBatch(batchOperation);

當我第一次運行此代碼時,它運行正常。 在這結束時,我在表中有2行。

問題出在第二輪。 當我執行此代碼時:

TableBatchOperation batchOperation = new TableBatchOperation();
CachedUrl customer1 = new CachedUrl(Guid.Empty, "test1");
CachedUrl customer2 = new CachedUrl(Guid.Empty, "test2");
CachedUrl customer3 = new CachedUrl(Guid.Empty, "test3");
batchOperation.Insert(customer1);
batchOperation.Insert(customer2);
batchOperation.Insert(customer3);
table.ExecuteBatch(batchOperation);

注意添加customer3

期望獲得的是一條消息:

  • customer1 - 存在
  • customer2 - 存在
  • customer3 - 補充說

我實際得到的是這個異常(在ExecuteBatch()方法上):

請求信息請求ID:5116ee8a-0002-0024-7ac1-415787000000 RequestDate:星期五,18十一月2016 17:33:08 GMT StatusMessage:0:指定的實體已存在。 錯誤代碼:EntityAlreadyExists

服務器發現#1實體存在,因此跳過整個任務。

我怎樣才能得到預期的答案?

天真的解決方案是嘗試逐個添加所有N個項目。 但是這個解決方案是最慢的(N HTTP請求而不是1個請求)。

Azure表存儲批處理操作是原子操作,因此預計會在第一次失敗的操作時返回。 批處理操作可能包含1000個操作,表服務在檢測到第一個故障后繼續執行所有操作沒有多大意義。

存儲異常返回批處理中失敗操作的實際索引以及與之相關的錯誤。

在下面的示例中,失敗操作的索引為0,錯誤為EntityAlreadyExists:

0 :指定的實體已存在。 錯誤代碼:EntityAlreadyExists

您可以編寫捕獲StorageException的重試邏輯,解析錯誤,如果錯誤是EntityAlreadyExists,則從批處理中刪除該索引的操作,然后重新提交批處理操作。

請參閱我在Nuget中實現的azure Storage Exception解析器,它為您提取StorageException對象中的失敗操作索引和其他有用信息,如HttpStatusCode: https//www.nuget.org/packages/AzureStorageExceptionParser/

為了避免在每次失敗的操作中多次來回調用azure,以下是您可以探索的替代解決方案:

每次向表中插入實體時,還會插入第二個實體,該實體具有僅包含行鍵的一個屬性的相同分區鍵。 讓我們調用第二個實體RowKeyTracker實體。 它將與原始實體具有相同的分區鍵,以便您可以執行批處理操作。 它將具有一個唯一的行鍵,您可以知道它以查詢它,它將具有一個屬性,該屬性是該分區的附加行鍵。 如果RowKeyTracker實體已存在,則只需在每次插入新實體時將新行鍵附加到其分區鍵的行鍵屬性,反之亦然,當您刪除實體時,您也可以繼續從RowKeyTracker中刪除該行鍵實體。

因此,您可以使用此行鍵跟蹤器實體通過先查詢它來確定是否已插入該分區的Row鍵。

您可以將此方法與第一種方法(重試)結合使用,以獲得更強大的解決方案

這是預期的行為。 只要該批次中的任何實體失敗,整個批次就會失敗。

你可以做的一件事是使用InsertOrReplace方法而不是Insert 這將更新實體(如果存在),否則插入實體。

文檔

將TableOperation添加到TableBatchOperation,如果實體不存在,則將指定的實體插入表中; 如果實體確實存在,那么其內容將被提供的實體替換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM